/*
 * Snippet :: jQuery Syntax Highlighter v2.0.0
 * http://steamdev.com/snippet
 *
 * Copyright 2011, SteamDev
 * Released under the MIT license.
 * http://www.opensource.org/licenses/mit-license.php
 *
 * Date: Wed Jan 19, 2011
 */

(function($) {

	// enables console.log() in all browsers for error messages
	window.log = function() {
		log.history = log.history || [];
		log.history.push(arguments);
		if (this.console) {
			console.log(Array.prototype.slice.call(arguments));
		}
	};

	$.fn.snippet = function(language, settings) {

		if (typeof language == "object") {
			settings = language;
		}

		if (typeof language == "string") {
			language = language.toLowerCase();
		}

		var defaults = {
			style : "random",
			showNum : true,
			transparent : false,
			collapse : false,
			menu : true,
			showMsg : "Expand Code",
			hideMsg : "Collapse Code",
			clipboard : "",
			startCollapsed : true,
			startText : false,
			box : "",
			boxColor : "",
			boxFill : ""
		};

		// array containing all style names
		var styleArr = [ "acid", "berries-dark", "berries-light", "bipolar",
				"blacknblue", "bright", "contrast", "darkblue", "darkness",
				"desert", "dull", "easter", "emacs", "golden", "greenlcd",
				"ide-anjuta", "ide-codewarrior", "ide-devcpp", "ide-eclipse",
				"ide-kdev", "ide-msvcpp", "kwrite", "matlab", "navy", "nedit",
				"neon", "night", "pablo", "peachpuff", "print", "rand01",
				"the", "typical", "vampire", "vim", "vim-dark", "whatis",
				"whitengrey", "zellner" ];

		if (settings) {
			$.extend(defaults, settings);
		}

		return this
				.each(function() {

					// variable containing the style to be used
					var useStyle = defaults.style.toLowerCase();
					if (defaults.style == "random") {
						var randomnumber = Math.floor(Math.random()
								* (styleArr.length));
						useStyle = styleArr[randomnumber];
					}

					// variable containing the selected node
					var o = $(this);

					// the name of the selected node
					var node = this.nodeName.toLowerCase();

					// if the node is indeed a <pre> element...
					if (node == "pre") {

						// saves the original html as a data on the node
						if (o.data('orgHtml') == undefined
								|| o.data('orgHtml') == null) {
							var orgHtml = o.html();
							o.data('orgHtml', orgHtml);
						}

						// if node IS NOT an existing Snippet...
						if (!o.parent().hasClass("snippet-wrap")) {

							// if language is NOT a string...
							if (typeof language != "string") {
								if (o.attr('class').length > 0) {
									var errclass = " class=\""
											+ o.attr('class') + "\"";
								} else {
									var errclass = "";
								}
								if (o.attr('id').length > 0) {
									var errid = " id=\"" + o.attr('id') + "\"";
								} else {
									var errid = "";
								}
								var error = "Snippet Error: You must specify a language on inital usage of Snippet. Reference <pre"
										+ errclass + errid + ">";
								console.log(error);
								return false;
							}

							o.addClass("sh_" + language).addClass(
									"snippet-formatted").wrap(
									"<div class='snippet-container' style='"
											+ o.attr('style')
											+ ";'><div class='sh_" + useStyle
											+ " snippet-wrap'></div></div>");
							o.removeAttr('style');
							sh_highlightDocument();

							// build an ordered list if showNum is true
							if (defaults.showNum) {
								var newhtml = o.html();
								newhtml = newhtml.replace(/\n/g, "</li><li>");
								newhtml = "<ol class='snippet-num'><li>"
										+ newhtml + "</li></ol>";
								while (newhtml.indexOf("<li></li></ol>") != -1) {
									newhtml = newhtml.replace("<li></li></ol>",
											"</ol>");
								}
							}
							// build an unordered list if showNum is false
							else {
								var newhtml = o.html();
								newhtml = newhtml.replace(/\n/g, "</li><li>");
								newhtml = "<ul class='snippet-no-num'><li>"
										+ newhtml + "</li></ul>";
								while (newhtml.indexOf("<li></li></ul>") != -1) {
									newhtml = newhtml.replace("<li></li></ul>",
											"</ul>");
								}
							}

							// normalizes tab space by replacing them with 4
							// non-breaking spaces
							newhtml = newhtml.replace(/\t/g,
									"&nbsp;&nbsp;&nbsp;&nbsp;");

							// insert highlighted code into <pre> element
							o.html(newhtml);

							// cleans up the highlighted html
							while (o.find("li").eq(0).html() == "") {
								o.find("li").eq(0).remove();
							}
							o
									.find("li")
									.each(
											function() {
												if ($(this).html().length < 2) {
													var rep = ($(this).html())
															.replace(/\s/g, "");
													if (rep == "") {
														if ($.browser.opera) {
															$(this).html(
																	"&nbsp;");
														} else {
															$(this)
																	.html(
																			"<span style='display:none;'>&nbsp;</span>");
														}
													}
												}
											});

							// builds text-only view and hover menu
							var txtOnly = "<pre class='snippet-textonly sh_sourceCode' style='display:none;'>"
									+ o.data('orgHtml') + "</pre>";
							var controls = "<div class='snippet-menu sh_sourceCode' style='display:none;'><pre>"
									+ "<a class='snippet-copy' href='#'>copy</a>"
									+ "<a class='snippet-text' href='#'>text</a>"
									+ "<a class='snippet-window' href='#'>pop-up</a>"
									+ "</pre></div>";

							o.parent().append(txtOnly);
							o.parent().prepend(controls);
							o.parent().hover(function() {
								$(this).find('.snippet-menu').fadeIn("fast");
							}, function() {
								$(this).find('.snippet-menu').fadeOut("fast");
							});

							// builds clipboard
							if (defaults.clipboard != ""
									&& defaults.clipboard != false) {
								var cpy = o.parent().find('a.snippet-copy');
								cpy.show();
								cpy.parents('.snippet-menu').show();
								var txt = o.parents('.snippet-wrap').find(
										'.snippet-textonly').text();
								ZeroClipboard.setMoviePath(defaults.clipboard);
								var clip = new ZeroClipboard.Client();
								clip.setText(txt);
								clip.glue(cpy[0],
										cpy.parents('.snippet-menu')[0]);
								clip.addEventListener('complete', function(
										client, text) {
									if (text.length > 500) {
										text = text.substr(0, 500) + "...\n\n("
												+ (text.length - 500)
												+ " characters not shown)";
									}
									alert("Copied text to clipboard:\n\n "
											+ text);
								});

								cpy.parents('.snippet-menu').hide();

							} else {
								o.parent().find('a.snippet-copy').hide();
							}

							// click event for text-only view
							o.parent().find("a.snippet-text").click(
									function() {
										var org = $(this).parents(
												'.snippet-wrap').find(
												'.snippet-formatted');
										var txt = $(this).parents(
												'.snippet-wrap').find(
												'.snippet-textonly');
										org.toggle();
										txt.toggle();

										if (txt.is(':visible')) {
											$(this).html("html");
										} else {
											$(this).html("text");
										}
										$(this).blur();
										return false;
									});

							// click event for popup view
							o.parent().find("a.snippet-window").click(
									function() {
										var txt = $(this).parents(
												'.snippet-wrap').find(
												'.snippet-textonly').html();
										snippetPopup(txt);
										$(this).blur();
										return false;
									});

							// disables menu
							if (!defaults.menu) {
								o.prev('.snippet-menu').find(
										'pre,.snippet-clipboard').hide();
							}

							// collapse functionality
							if (defaults.collapse) {
								var styleClass = o.parent().attr('class');
								var collapseShow = "<div class='snippet-reveal "
										+ styleClass
										+ "'><pre class='sh_sourceCode'><a href='#' class='snippet-toggle'>"
										+ defaults.showMsg + "</a></pre></div>";
								var collapseHide = "<div class='sh_sourceCode snippet-hide'><pre><a href='#' class='snippet-revealed snippet-toggle'>"
										+ defaults.hideMsg + "</a></pre></div>";

								o.parents('.snippet-container').append(
										collapseShow);
								o.parent().append(collapseHide);

								var root = o.parents('.snippet-container');
								if (defaults.startCollapsed) {
									root.find('.snippet-reveal').show();
									root.find('.snippet-wrap').eq(0).hide();
								} else {
									root.find('.snippet-reveal').hide();
									root.find('.snippet-wrap').eq(0).show();
								}

								root.find('a.snippet-toggle').click(function() {
									root.find('.snippet-wrap').toggle();
									return false;
								});

							}

							// makes snippet background transparent
							if (defaults.transparent) {
								var styleObj = {
									"background-color" : "transparent",
									"box-shadow" : "none",
									"-moz-box-shadow" : "none",
									"-webkit-box-shadow" : "none"
								}
								o.css(styleObj);
								o.next(".snippet-textonly").css(styleObj);
								o.parents('.snippet-container').find(
										'.snippet-reveal pre').css(styleObj);
							}

							// starts snippet on text-only view
							if (defaults.startText) {
								o.hide();
								o.next(".snippet-textonly").show();
								o.parent().find(".snippet-text").html("html");

							}

							// boxes in specified lines of code
							if (defaults.box != "") {
								var spacer = "<span class='box-sp'>&nbsp;</span>";
								var boxNums = defaults.box.split(',');
								for ( var i = 0; i < boxNums.length; i++) {
									var boxNum = boxNums[i];
									if (boxNum.indexOf('-') == -1) {
										boxNum = parseFloat(boxNum) - 1;
										o.find("li").eq(boxNum).addClass('box')
												.prepend(spacer);
									} else {
										var numStart = parseFloat(boxNum
												.split('-')[0]) - 1;
										var numEnd = parseFloat(boxNum
												.split('-')[1]) - 1;
										if (numStart < numEnd) {
											o.find("li").eq(numStart).addClass(
													'box box-top').prepend(
													spacer);
											o.find("li").eq(numEnd).addClass(
													'box box-bot').prepend(
													spacer);
											for ( var x = numStart + 1; x < numEnd; x++) {
												o.find("li").eq(x).addClass(
														'box box-mid').prepend(
														spacer);
											}
										} else if (numStart == numEnd) {
											o.find("li").eq(numStart).addClass(
													'box').prepend(spacer);
										}
									}

								}

								// sets the color of the box
								if (defaults.boxColor != "") {
									o.find("li.box").css('border-color',
											defaults.boxColor);
								}

								// sets the fill (background color) of the box
								if (defaults.boxFill != "") {
									o
											.find(
													"li.box, li.box-top, li.box-mid, li.box-bot")
											.addClass('box-bg').css(
													'background-color',
													defaults.boxFill);
								}

								if ($.browser.webkit) {
									o.find(".snippet-num li.box").css(
											'margin-left', '-3.3em');
									o.find(".snippet-num li .box-sp").css(
											'width', '21px');
								}

							}

							// adds a css class to all links in the snippet so
							// they are themed properly
							o.parents('.snippet-container').find("a").addClass(
									"sh_url");

						}
						// if node IS an existing Snippet...
						else {

							// set new style classes, remove boxes
							o.parent().attr("class",
									"sh_" + useStyle + " snippet-wrap");
							o.parents('.snippet-container').find(
									'.snippet-reveal').attr(
									"class",
									"sh_" + useStyle
											+ " snippet-wrap snippet-reveal");
							o
									.find(
											"li.box, li.box-top, li.box-mid, li.box-bot")
									.removeAttr('style').removeAttr('class');
							o.find("li .box-sp").remove();

							// set background to transparent
							if (defaults.transparent) {
								var styleObj = {
									"background-color" : "transparent",
									"box-shadow" : "none",
									"-moz-box-shadow" : "none",
									"-webkit-box-shadow" : "none"
								}
								o.css(styleObj);
								o.next(".snippet-textonly").css(styleObj);
								o.parents('.snippet-container').find(
										'.snippet-hide pre').css(styleObj);
							}
							// remove transparency
							else {
								var styleObj = {
									"background-color" : "",
									"box-shadow" : "",
									"-moz-box-shadow" : "",
									"-webkit-box-shadow" : ""
								}
								o.css(styleObj);
								o.next(".snippet-textonly").css(styleObj);
								o.parents('.snippet-container').find(
										'.snippet-reveal pre').css(styleObj);
							}

							// show numbers by switching <ul> to <ol>
							if (defaults.showNum) {

								var list = o.find("li").eq(0).parent();
								if (list.hasClass("snippet-no-num")) {
									list.wrap("<ol class='snippet-num'></ol>");
									var li = o.find("li").eq(0);
									li.unwrap();
								}
							}
							// hide numbers by switching <ol> to <ul>
							else {
								var list = o.find("li").eq(0).parent();
								if (list.hasClass("snippet-num")) {
									list
											.wrap("<ul class='snippet-no-num'></ul>");
									var li = o.find("li").eq(0);
									li.unwrap();
								}
							}

							// box in specified lines
							if (defaults.box != "") {
								var spacer = "<span class='box-sp'>&nbsp;</span>";
								var boxNums = defaults.box.split(',');
								for ( var i = 0; i < boxNums.length; i++) {
									var boxNum = boxNums[i];
									if (boxNum.indexOf('-') == -1) {
										boxNum = parseFloat(boxNum) - 1;
										o.find("li").eq(boxNum).addClass('box')
												.prepend(spacer);
									} else {
										var numStart = parseFloat(boxNum
												.split('-')[0]) - 1;
										var numEnd = parseFloat(boxNum
												.split('-')[1]) - 1;
										if (numStart < numEnd) {
											o.find("li").eq(numStart).addClass(
													'box box-top').prepend(
													spacer);
											o.find("li").eq(numEnd).addClass(
													'box box-bot').prepend(
													spacer);
											for ( var x = numStart + 1; x < numEnd; x++) {
												o.find("li").eq(x).addClass(
														'box box-mid').prepend(
														spacer);
											}
										} else if (numStart == numEnd) {
											o.find("li").eq(numStart).addClass(
													'box').prepend(spacer);
										}
									}

								}

								if (defaults.boxColor != "") {
									o.find("li.box").css('border-color',
											defaults.boxColor);
								}

								if (defaults.boxFill != "") {
									o.find("li.box").addClass('box-bg').css(
											'background-color',
											defaults.boxFill);
								}

								if ($.browser.webkit) {
									o.find(".snippet-num li.box").css(
											'margin-left', '-3.3em');
									o.find(".snippet-num li .box-sp").css(
											'width', '21px');
								}

							}

							sh_highlightDocument();

							// show/hide hover menu
							if (!defaults.menu) {
								o.prev('.snippet-menu').find(
										'pre,.snippet-clipboard').hide();
							} else {
								o.prev('.snippet-menu').find(
										'pre,.snippet-clipboard').show();
							}

						}

					} else {
						var error = "Snippet Error: Sorry, Snippet only formats '<pre>' elements. '<"
								+ node
								+ ">' elements are currently unsupported.";
						console.log(error);
						return false;
					}

				});

	};

})(jQuery);

// snippet new window popup function
function snippetPopup(content) {
	top.consoleRef = window.open('', 'myconsole', 'width=600,height=300'
			+ ',left=50,top=50' + ',menubar=0' + ',toolbar=0' + ',location=0'
			+ ',status=0' + ',scrollbars=1' + ',resizable=1');
	top.consoleRef.document
			.writeln('<html><head><title>Snippet :: Code View :: '
					+ location.href + '</title></head>'
					+ '<body bgcolor=white onLoad="self.focus()">' + '<pre>'
					+ content + '</pre>' + '</body></html>');
	top.consoleRef.document.close();
}

// ZeroClipboard
// Simple Set Clipboard System
// Author: Joseph Huckaby

var ZeroClipboard = {

	version : "1.0.7",
	clients : {}, // registered upload clients on page, indexed by id
	moviePath : 'ZeroClipboard.swf', // URL to movie
	nextId : 1, // ID of next movie

	$ : function(thingy) {
		// simple DOM lookup utility function
		if (typeof (thingy) == 'string')
			thingy = document.getElementById(thingy);
		if (!thingy.addClass) {
			// extend element with a few useful methods
			thingy.hide = function() {
				this.style.display = 'none';
			};
			thingy.show = function() {
				this.style.display = '';
			};
			thingy.addClass = function(name) {
				this.removeClass(name);
				this.className += ' ' + name;
			};
			thingy.removeClass = function(name) {
				var classes = this.className.split(/\s+/);
				var idx = -1;
				for ( var k = 0; k < classes.length; k++) {
					if (classes[k] == name) {
						idx = k;
						k = classes.length;
					}
				}
				if (idx > -1) {
					classes.splice(idx, 1);
					this.className = classes.join(' ');
				}
				return this;
			};
			thingy.hasClass = function(name) {
				return !!this.className
						.match(new RegExp("\\s*" + name + "\\s*"));
			};
		}
		return thingy;
	},

	setMoviePath : function(path) {
		// set path to ZeroClipboard.swf
		this.moviePath = path;
	},

	dispatch : function(id, eventName, args) {
		// receive event from flash movie, send to client
		var client = this.clients[id];
		if (client) {
			client.receiveEvent(eventName, args);
		}
	},

	register : function(id, client) {
		// register new client to receive events
		this.clients[id] = client;
	},

	getDOMObjectPosition : function(obj, stopObj) {
		// get absolute coordinates for dom element
		var info = {
			left : 0,
			top : 0,
			width : obj.width ? obj.width : obj.offsetWidth,
			height : obj.height ? obj.height : obj.offsetHeight
		};

		while (obj && (obj != stopObj)) {
			info.left += obj.offsetLeft;
			info.top += obj.offsetTop;
			obj = obj.offsetParent;
		}

		return info;
	},

	Client : function(elem) {
		// constructor for new simple upload client
		this.handlers = {};

		// unique ID
		this.id = ZeroClipboard.nextId++;
		this.movieId = 'ZeroClipboardMovie_' + this.id;

		// register client with singleton to receive flash events
		ZeroClipboard.register(this.id, this);

		// create movie
		if (elem)
			this.glue(elem);
	}
};

ZeroClipboard.Client.prototype = {

	id : 0, // unique ID for us
	ready : false, // whether movie is ready to receive events or not
	movie : null, // reference to movie object
	clipText : '', // text to copy to clipboard
	handCursorEnabled : true, // whether to show hand cursor, or default
								// pointer cursor
	cssEffects : true, // enable CSS mouse effects on dom container
	handlers : null, // user event handlers

	glue : function(elem, appendElem, stylesToAdd) {
		// glue to DOM element
		// elem can be ID or actual DOM element object
		this.domElement = ZeroClipboard.$(elem);

		// float just above object, or zIndex 99 if dom element isn't set
		var zIndex = 99;
		if (this.domElement.style.zIndex) {
			zIndex = parseInt(this.domElement.style.zIndex, 10) + 1;
		}

		if (typeof (appendElem) == 'string') {
			appendElem = ZeroClipboard.$(appendElem);
		} else if (typeof (appendElem) == 'undefined') {
			appendElem = document.getElementsByTagName('body')[0];
		}

		// find X/Y position of domElement
		var box = ZeroClipboard.getDOMObjectPosition(this.domElement,
				appendElem);

		// create floating DIV above element
		this.div = document.createElement('div');
		this.div.className = "snippet-clipboard";
		var style = this.div.style;
		style.position = 'absolute';
		style.left = '' + box.left + 'px';
		style.top = '' + box.top + 'px';
		style.width = '' + box.width + 'px';
		style.height = '' + box.height + 'px';
		style.zIndex = zIndex;

		if (typeof (stylesToAdd) == 'object') {
			for (addedStyle in stylesToAdd) {
				style[addedStyle] = stylesToAdd[addedStyle];
			}
		}

		// style.backgroundColor = '#f00'; // debug

		appendElem.appendChild(this.div);

		this.div.innerHTML = this.getHTML(box.width, box.height);
	},

	getHTML : function(width, height) {
		// return HTML for movie
		var html = '';
		var flashvars = 'id=' + this.id + '&width=' + width + '&height='
				+ height;

		if (navigator.userAgent.match(/MSIE/)) {
			// IE gets an OBJECT tag
			var protocol = location.href.match(/^https/i) ? 'https://'
					: 'http://';
			html += '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="'
					+ protocol
					+ 'download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="'
					+ width
					+ '" height="'
					+ height
					+ '" id="'
					+ this.movieId
					+ '" align="middle"><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="false" /><param name="movie" value="'
					+ ZeroClipboard.moviePath
					+ '" /><param name="loop" value="false" /><param name="menu" value="false" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="flashvars" value="'
					+ flashvars
					+ '"/><param name="wmode" value="transparent"/></object>';
		} else {
			// all other browsers get an EMBED tag
			html += '<embed id="'
					+ this.movieId
					+ '" src="'
					+ ZeroClipboard.moviePath
					+ '" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="'
					+ width
					+ '" height="'
					+ height
					+ '" name="'
					+ this.movieId
					+ '" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="'
					+ flashvars + '" wmode="transparent" />';
		}
		return html;
	},

	hide : function() {
		// temporarily hide floater offscreen
		if (this.div) {
			this.div.style.left = '-2000px';
		}
	},

	show : function() {
		// show ourselves after a call to hide()
		this.reposition();
	},

	destroy : function() {
		// destroy control and floater
		if (this.domElement && this.div) {
			this.hide();
			this.div.innerHTML = '';

			var body = document.getElementsByTagName('body')[0];
			try {
				body.removeChild(this.div);
			} catch (e) {
				;
			}

			this.domElement = null;
			this.div = null;
		}
	},

	reposition : function(elem) {
		// reposition our floating div, optionally to new container
		// warning: container CANNOT change size, only position
		if (elem) {
			this.domElement = ZeroClipboard.$(elem);
			if (!this.domElement)
				this.hide();
		}

		if (this.domElement && this.div) {
			var box = ZeroClipboard.getDOMObjectPosition(this.domElement);
			var style = this.div.style;
			style.left = '' + box.left + 'px';
			style.top = '' + box.top + 'px';
		}
	},

	setText : function(newText) {
		// set text to be copied to clipboard
		this.clipText = newText;
		if (this.ready) {
			this.movie.setText(newText);
		}
	},

	addEventListener : function(eventName, func) {
		// add user event listener for event
		// event types: load, queueStart, fileStart, fileComplete,
		// queueComplete, progress, error, cancel
		eventName = eventName.toString().toLowerCase().replace(/^on/, '');
		if (!this.handlers[eventName]) {
			this.handlers[eventName] = [];
		}
		this.handlers[eventName].push(func);
	},

	setHandCursor : function(enabled) {
		// enable hand cursor (true), or default arrow cursor (false)
		this.handCursorEnabled = enabled;
		if (this.ready) {
			this.movie.setHandCursor(enabled);
		}
	},

	setCSSEffects : function(enabled) {
		// enable or disable CSS effects on DOM container
		this.cssEffects = !!enabled;
	},

	receiveEvent : function(eventName, args) {
		// receive event from flash
		eventName = eventName.toString().toLowerCase().replace(/^on/, '');

		// special behavior for certain events
		switch (eventName) {
		case 'load':
			// movie claims it is ready, but in IE this isn't always the case...
			// bug fix: Cannot extend EMBED DOM elements in Firefox, must use
			// traditional function
			this.movie = document.getElementById(this.movieId);
			if (!this.movie) {
				var self = this;
				setTimeout(function() {
					self.receiveEvent('load', null);
				}, 1);
				return;
			}

			// firefox on pc needs a "kick" in order to set these in certain
			// cases
			if (!this.ready && navigator.userAgent.match(/Firefox/)
					&& navigator.userAgent.match(/Windows/)) {
				var self = this;
				setTimeout(function() {
					self.receiveEvent('load', null);
				}, 100);
				this.ready = true;
				return;
			}

			this.ready = true;
			try {
				this.movie.setText(this.clipText);
			} catch (e) {
			}
			try {
				this.movie.setHandCursor(this.handCursorEnabled);
			} catch (e) {
			}
			break;

		case 'mouseover':
			if (this.domElement && this.cssEffects) {
				this.domElement.addClass('hover');
				if (this.recoverActive) {
					this.domElement.addClass('active');
				}
			}
			break;

		case 'mouseout':
			if (this.domElement && this.cssEffects) {
				this.recoverActive = false;
				if (this.domElement.hasClass('active')) {
					this.domElement.removeClass('active');
					this.recoverActive = true;
				}
				this.domElement.removeClass('hover');
			}
			break;

		case 'mousedown':
			if (this.domElement && this.cssEffects) {
				this.domElement.addClass('active');
			}
			break;

		case 'mouseup':
			if (this.domElement && this.cssEffects) {
				this.domElement.removeClass('active');
				this.recoverActive = false;
			}
			break;
		} // switch eventName

		if (this.handlers[eventName]) {
			for ( var idx = 0, len = this.handlers[eventName].length; idx < len; idx++) {
				var func = this.handlers[eventName][idx];

				if (typeof (func) == 'function') {
					// actual function reference
					func(this, args);
				} else if ((typeof (func) == 'object') && (func.length == 2)) {
					// PHP style object + method, i.e. [myObject, 'myMethod']
					func[0][func[1]](this, args);
				} else if (typeof (func) == 'string') {
					// name of function
					window[func](this, args);
				}
			} // foreach event handler defined
		} // user defined handler for event
	}

};

/* SHJS */
/* Copyright (C) 2007, 2008 gnombat@users.sourceforge.net */
/* License: http://shjs.sourceforge.net/doc/gplv3.html */

if (!this.sh_languages) {
	this.sh_languages = {}
}
var sh_requests = {};
function sh_isEmailAddress(a) {
	if (/^mailto:/.test(a)) {
		return false
	}
	return a.indexOf("@") !== -1
}
function sh_setHref(b, c, d) {
	var a = d.substring(b[c - 2].pos, b[c - 1].pos);
	if (a.length >= 2 && a.charAt(0) === "<" && a.charAt(a.length - 1) === ">") {
		a = a.substr(1, a.length - 2)
	}
	if (sh_isEmailAddress(a)) {
		a = "mailto:" + a
	}
	b[c - 2].node.href = a
}
function sh_konquerorExec(b) {
	var a = [ "" ];
	a.index = b.length;
	a.input = b;
	return a
}
function sh_highlightString(B, o) {
	if (/Konqueror/.test(navigator.userAgent)) {
		if (!o.konquered) {
			for ( var F = 0; F < o.length; F++) {
				for ( var H = 0; H < o[F].length; H++) {
					var G = o[F][H][0];
					if (G.source === "$") {
						G.exec = sh_konquerorExec
					}
				}
			}
			o.konquered = true
		}
	}
	var N = document.createElement("a");
	var q = document.createElement("span");
	var A = [];
	var j = 0;
	var n = [];
	var C = 0;
	var k = null;
	var x = function(i, a) {
		var p = i.length;
		if (p === 0) {
			return
		}
		if (!a) {
			var Q = n.length;
			if (Q !== 0) {
				var r = n[Q - 1];
				if (!r[3]) {
					a = r[1]
				}
			}
		}
		if (k !== a) {
			if (k) {
				A[j++] = {
					pos : C
				};
				if (k === "sh_url") {
					sh_setHref(A, j, B)
				}
			}
			if (a) {
				var P;
				if (a === "sh_url") {
					P = N.cloneNode(false)
				} else {
					P = q.cloneNode(false)
				}
				P.className = a;
				A[j++] = {
					node : P,
					pos : C
				}
			}
		}
		C += p;
		k = a
	};
	var t = /\r\n|\r|\n/g;
	t.lastIndex = 0;
	var d = B.length;
	while (C < d) {
		var v = C;
		var l;
		var w;
		var h = t.exec(B);
		if (h === null) {
			l = d;
			w = d
		} else {
			l = h.index;
			w = t.lastIndex
		}
		var g = B.substring(v, l);
		var M = [];
		for (;;) {
			var I = C - v;
			var D;
			var y = n.length;
			if (y === 0) {
				D = 0
			} else {
				D = n[y - 1][2]
			}
			var O = o[D];
			var z = O.length;
			var m = M[D];
			if (!m) {
				m = M[D] = []
			}
			var E = null;
			var u = -1;
			for ( var K = 0; K < z; K++) {
				var f;
				if (K < m.length && (m[K] === null || I <= m[K].index)) {
					f = m[K]
				} else {
					var c = O[K][0];
					c.lastIndex = I;
					f = c.exec(g);
					m[K] = f
				}
				if (f !== null && (E === null || f.index < E.index)) {
					E = f;
					u = K;
					if (f.index === I) {
						break
					}
				}
			}
			if (E === null) {
				x(g.substring(I), null);
				break
			} else {
				if (E.index > I) {
					x(g.substring(I, E.index), null)
				}
				var e = O[u];
				var J = e[1];
				var b;
				if (J instanceof Array) {
					for ( var L = 0; L < J.length; L++) {
						b = E[L + 1];
						x(b, J[L])
					}
				} else {
					b = E[0];
					x(b, J)
				}
				switch (e[2]) {
				case -1:
					break;
				case -2:
					n.pop();
					break;
				case -3:
					n.length = 0;
					break;
				default:
					n.push(e);
					break
				}
			}
		}
		if (k) {
			A[j++] = {
				pos : C
			};
			if (k === "sh_url") {
				sh_setHref(A, j, B)
			}
			k = null
		}
		C = w
	}
	return A
}
function sh_getClasses(d) {
	var a = [];
	var b = d.className;
	if (b && b.length > 0) {
		var e = b.split(" ");
		for ( var c = 0; c < e.length; c++) {
			if (e[c].length > 0) {
				a.push(e[c])
			}
		}
	}
	return a
}
function sh_addClass(c, a) {
	var d = sh_getClasses(c);
	for ( var b = 0; b < d.length; b++) {
		if (a.toLowerCase() === d[b].toLowerCase()) {
			return
		}
	}
	d.push(a);
	c.className = d.join(" ")
}
function sh_extractTagsFromNodeList(c, a) {
	var f = c.length;
	for ( var d = 0; d < f; d++) {
		var e = c.item(d);
		switch (e.nodeType) {
		case 1:
			if (e.nodeName.toLowerCase() === "br") {
				var b;
				if (/MSIE/.test(navigator.userAgent)) {
					b = "\r"
				} else {
					b = "\n"
				}
				a.text.push(b);
				a.pos++
			} else {
				a.tags.push({
					node : e.cloneNode(false),
					pos : a.pos
				});
				sh_extractTagsFromNodeList(e.childNodes, a);
				a.tags.push({
					pos : a.pos
				})
			}
			break;
		case 3:
		case 4:
			a.text.push(e.data);
			a.pos += e.length;
			break
		}
	}
}
function sh_extractTags(c, b) {
	var a = {};
	a.text = [];
	a.tags = b;
	a.pos = 0;
	sh_extractTagsFromNodeList(c.childNodes, a);
	return a.text.join("")
}
function sh_mergeTags(d, f) {
	var a = d.length;
	if (a === 0) {
		return f
	}
	var c = f.length;
	if (c === 0) {
		return d
	}
	var i = [];
	var e = 0;
	var b = 0;
	while (e < a && b < c) {
		var h = d[e];
		var g = f[b];
		if (h.pos <= g.pos) {
			i.push(h);
			e++
		} else {
			i.push(g);
			if (f[b + 1].pos <= h.pos) {
				b++;
				i.push(f[b]);
				b++
			} else {
				i.push({
					pos : h.pos
				});
				f[b] = {
					node : g.node.cloneNode(false),
					pos : h.pos
				}
			}
		}
	}
	while (e < a) {
		i.push(d[e]);
		e++
	}
	while (b < c) {
		i.push(f[b]);
		b++
	}
	return i
}
function sh_insertTags(k, h) {
	var g = document;
	var l = document.createDocumentFragment();
	var e = 0;
	var d = k.length;
	var b = 0;
	var j = h.length;
	var c = l;
	while (b < j || e < d) {
		var i;
		var a;
		if (e < d) {
			i = k[e];
			a = i.pos
		} else {
			a = j
		}
		if (a <= b) {
			if (i.node) {
				var f = i.node;
				c.appendChild(f);
				c = f
			} else {
				c = c.parentNode
			}
			e++
		} else {
			c.appendChild(g.createTextNode(h.substring(b, a)));
			b = a
		}
	}
	return l
}
function sh_highlightElement(d, g) {
	sh_addClass(d, "sh_sourceCode");
	var c = [];
	var e = sh_extractTags(d, c);
	var f = sh_highlightString(e, g);
	var b = sh_mergeTags(c, f);
	var a = sh_insertTags(b, e);
	while (d.hasChildNodes()) {
		d.removeChild(d.firstChild)
	}
	d.appendChild(a)
}
function sh_getXMLHttpRequest() {
	if (window.ActiveXObject) {
		return new ActiveXObject("Msxml2.XMLHTTP")
	} else {
		if (window.XMLHttpRequest) {
			return new XMLHttpRequest()
		}
	}
	throw "No XMLHttpRequest implementation available"
}
function sh_load(language, element, prefix, suffix) {
	if (language in sh_requests) {
		sh_requests[language].push(element);
		return
	}
	sh_requests[language] = [ element ];
	var request = sh_getXMLHttpRequest();
	var url = prefix + "sh_" + language + suffix;
	request.open("GET", url, true);
	request.onreadystatechange = function() {
		if (request.readyState === 4) {
			try {
				if (!request.status || request.status === 200) {
					eval(request.responseText);
					var elements = sh_requests[language];
					for ( var i = 0; i < elements.length; i++) {
						sh_highlightElement(elements[i], sh_languages[language])
					}
				} else {
					throw "HTTP error: status " + request.status
				}
			} finally {
				request = null
			}
		}
	};
	request.send(null)
}

function sh_highlightDocument(prefix, suffix) {
	var nodeList = document.getElementsByTagName('pre');
	for ( var i = 0; i < nodeList.length; i++) {
		var element = nodeList.item(i);
		var htmlClasses = element.className.toLowerCase();
		var htmlClass = htmlClasses.replace(/sh_sourcecode/g, '');
		if (htmlClass.indexOf("sh_") != -1) {
			htmlClass = htmlClass.match(/(\bsh_)\w+\b/g)[0];
		}
		if (htmlClasses.indexOf('sh_sourcecode') != -1) {
			continue;
		}
		if (htmlClass.substr(0, 3) === 'sh_') {
			var language = htmlClass.substring(3);
			if (language in sh_languages) {
				sh_highlightElement(element, sh_languages[language]);
			} else if (typeof (prefix) === 'string'
					&& typeof (suffix) === 'string') {
				sh_load(language, element, prefix, suffix);
			} else {
				console.log('Found <pre> element with class="' + htmlClass
						+ '", but no such language exists');
				continue;
			}
			break;
		}
	}
}

/* C language (http://shjs.sourceforge.net/lang/sh_c.min.js) */
if (!this.sh_languages) {
	this.sh_languages = {}
}
sh_languages.c = [
		[
				[ /\/\/\//g, "sh_comment", 1 ],
				[ /\/\//g, "sh_comment", 7 ],
				[ /\/\*\*/g, "sh_comment", 8 ],
				[ /\/\*/g, "sh_comment", 9 ],
				[ /(\bstruct)([ \t]+)([A-Za-z0-9_]+)/g,
						[ "sh_keyword", "sh_normal", "sh_classname" ], -1 ],
				[ /^[ \t]*#(?:[ \t]*include)/g, "sh_preproc", 10, 1 ],
				[ /^[ \t]*#(?:[ \t]*[A-Za-z0-9_]*)/g, "sh_preproc", -1 ],
				[
						/\b[+-]?(?:(?:0x[A-Fa-f0-9]+)|(?:(?:[\d]*\.)?[\d]+(?:[eE][+-]?[\d]+)?))u?(?:(?:int(?:8|16|32|64))|L)?\b/g,
						"sh_number", -1 ],
				[ /"/g, "sh_string", 13 ],
				[ /'/g, "sh_string", 14 ],
				[
						/\b(?:__asm|__cdecl|__declspec|__export|__far16|__fastcall|__fortran|__import|__pascal|__rtti|__stdcall|_asm|_cdecl|__except|_export|_far16|_fastcall|__finally|_fortran|_import|_pascal|_stdcall|__thread|__try|asm|auto|break|case|catch|cdecl|const|continue|default|do|else|enum|extern|for|goto|if|pascal|register|return|sizeof|static|struct|switch|typedef|union|volatile|while)\b/g,
						"sh_keyword", -1 ],
				[
						/\b(?:bool|char|double|float|int|long|short|signed|unsigned|void|wchar_t)\b/g,
						"sh_type", -1 ],
				[ /~|!|%|\^|\*|\(|\)|-|\+|=|\[|\]|\\|:|;|,|\.|\/|\?|&|<|>|\|/g,
						"sh_symbol", -1 ],
				[ /\{|\}/g, "sh_cbracket", -1 ],
				[ /(?:[A-Za-z]|_)[A-Za-z0-9_]*(?=[ \t]*\()/g, "sh_function", -1 ],
				[
						/([A-Za-z](?:[^`~!@#$%&*()_=+{}|;:",<.>\/?'\\[\]\^\-\s]|[_])*)((?:<.*>)?)(\s+(?=[*&]*[A-Za-z][^`~!@#$%&*()_=+{}|;:",<.>\/?'\\[\]\^\-\s]*\s*[`~!@#$%&*()_=+{}|;:",<.>\/?'\\[\]\^\-\[\]]+))/g,
						[ "sh_usertype", "sh_usertype", "sh_normal" ], -1 ] ],
		[
				[ /$/g, null, -2 ],
				[
						/(?:<?)[A-Za-z0-9_\.\/\-_~]+@[A-Za-z0-9_\.\/\-_~]+(?:>?)|(?:<?)[A-Za-z0-9_]+:\/\/[A-Za-z0-9_\.\/\-_~]+(?:>?)/g,
						"sh_url", -1 ],
				[ /<\?xml/g, "sh_preproc", 2, 1 ],
				[ /<!DOCTYPE/g, "sh_preproc", 4, 1 ],
				[ /<!--/g, "sh_comment", 5 ],
				[ /<(?:\/)?[A-Za-z](?:[A-Za-z0-9_:.-]*)(?:\/)?>/g,
						"sh_keyword", -1 ],
				[ /<(?:\/)?[A-Za-z](?:[A-Za-z0-9_:.-]*)/g, "sh_keyword", 6, 1 ],
				[ /&(?:[A-Za-z0-9]+);/g, "sh_preproc", -1 ],
				[ /<(?:\/)?[A-Za-z][A-Za-z0-9]*(?:\/)?>/g, "sh_keyword", -1 ],
				[ /<(?:\/)?[A-Za-z][A-Za-z0-9]*/g, "sh_keyword", 6, 1 ],
				[ /@[A-Za-z]+/g, "sh_type", -1 ],
				[ /(?:TODO|FIXME|BUG)(?:[:]?)/g, "sh_todo", -1 ] ],
		[
				[ /\?>/g, "sh_preproc", -2 ],
				[ /([^=" \t>]+)([ \t]*)(=?)/g,
						[ "sh_type", "sh_normal", "sh_symbol" ], -1 ],
				[ /"/g, "sh_string", 3 ] ],
		[ [ /\\(?:\\|")/g, null, -1 ], [ /"/g, "sh_string", -2 ] ],
		[
				[ />/g, "sh_preproc", -2 ],
				[ /([^=" \t>]+)([ \t]*)(=?)/g,
						[ "sh_type", "sh_normal", "sh_symbol" ], -1 ],
				[ /"/g, "sh_string", 3 ] ],
		[ [ /-->/g, "sh_comment", -2 ], [ /<!--/g, "sh_comment", 5 ] ],
		[
				[ /(?:\/)?>/g, "sh_keyword", -2 ],
				[ /([^=" \t>]+)([ \t]*)(=?)/g,
						[ "sh_type", "sh_normal", "sh_symbol" ], -1 ],
				[ /"/g, "sh_string", 3 ] ],
		[ [ /$/g, null, -2 ] ],
		[
				[ /\*\//g, "sh_comment", -2 ],
				[
						/(?:<?)[A-Za-z0-9_\.\/\-_~]+@[A-Za-z0-9_\.\/\-_~]+(?:>?)|(?:<?)[A-Za-z0-9_]+:\/\/[A-Za-z0-9_\.\/\-_~]+(?:>?)/g,
						"sh_url", -1 ],
				[ /<\?xml/g, "sh_preproc", 2, 1 ],
				[ /<!DOCTYPE/g, "sh_preproc", 4, 1 ],
				[ /<!--/g, "sh_comment", 5 ],
				[ /<(?:\/)?[A-Za-z](?:[A-Za-z0-9_:.-]*)(?:\/)?>/g,
						"sh_keyword", -1 ],
				[ /<(?:\/)?[A-Za-z](?:[A-Za-z0-9_:.-]*)/g, "sh_keyword", 6, 1 ],
				[ /&(?:[A-Za-z0-9]+);/g, "sh_preproc", -1 ],
				[ /<(?:\/)?[A-Za-z][A-Za-z0-9]*(?:\/)?>/g, "sh_keyword", -1 ],
				[ /<(?:\/)?[A-Za-z][A-Za-z0-9]*/g, "sh_keyword", 6, 1 ],
				[ /@[A-Za-z]+/g, "sh_type", -1 ],
				[ /(?:TODO|FIXME|BUG)(?:[:]?)/g, "sh_todo", -1 ] ],
		[
				[ /\*\//g, "sh_comment", -2 ],
				[
						/(?:<?)[A-Za-z0-9_\.\/\-_~]+@[A-Za-z0-9_\.\/\-_~]+(?:>?)|(?:<?)[A-Za-z0-9_]+:\/\/[A-Za-z0-9_\.\/\-_~]+(?:>?)/g,
						"sh_url", -1 ],
				[ /(?:TODO|FIXME|BUG)(?:[:]?)/g, "sh_todo", -1 ] ],
		[ [ /$/g, null, -2 ], [ /</g, "sh_string", 11 ],
				[ /"/g, "sh_string", 12 ], [ /\/\/\//g, "sh_comment", 1 ],
				[ /\/\//g, "sh_comment", 7 ], [ /\/\*\*/g, "sh_comment", 8 ],
				[ /\/\*/g, "sh_comment", 9 ] ],
		[ [ /$/g, null, -2 ], [ />/g, "sh_string", -2 ] ],
		[ [ /$/g, null, -2 ], [ /\\(?:\\|")/g, null, -1 ],
				[ /"/g, "sh_string", -2 ] ],
		[ [ /"/g, "sh_string", -2 ], [ /\\./g, "sh_specialchar", -1 ] ],
		[ [ /'/g, "sh_string", -2 ], [ /\\./g, "sh_specialchar", -1 ] ] ];

/* C++ (cpp) language (http://shjs.sourceforge.net/lang/sh_cpp.min.js) */
if (!this.sh_languages) {
	this.sh_languages = {}
}
sh_languages.cpp = [
		[
				[ /(\b(?:class|struct|typename))([ \t]+)([A-Za-z0-9_]+)/g,
						[ "sh_keyword", "sh_normal", "sh_classname" ], -1 ],
				[
						/\b(?:class|const_cast|delete|dynamic_cast|explicit|false|friend|inline|mutable|namespace|new|operator|private|protected|public|reinterpret_cast|static_cast|template|this|throw|true|try|typeid|typename|using|virtual)\b/g,
						"sh_keyword", -1 ],
				[ /\/\/\//g, "sh_comment", 1 ],
				[ /\/\//g, "sh_comment", 7 ],
				[ /\/\*\*/g, "sh_comment", 8 ],
				[ /\/\*/g, "sh_comment", 9 ],
				[ /(\bstruct)([ \t]+)([A-Za-z0-9_]+)/g,
						[ "sh_keyword", "sh_normal", "sh_classname" ], -1 ],
				[ /^[ \t]*#(?:[ \t]*include)/g, "sh_preproc", 10, 1 ],
				[ /^[ \t]*#(?:[ \t]*[A-Za-z0-9_]*)/g, "sh_preproc", -1 ],
				[
						/\b[+-]?(?:(?:0x[A-Fa-f0-9]+)|(?:(?:[\d]*\.)?[\d]+(?:[eE][+-]?[\d]+)?))u?(?:(?:int(?:8|16|32|64))|L)?\b/g,
						"sh_number", -1 ],
				[ /"/g, "sh_string", 13 ],
				[ /'/g, "sh_string", 14 ],
				[
						/\b(?:__asm|__cdecl|__declspec|__export|__far16|__fastcall|__fortran|__import|__pascal|__rtti|__stdcall|_asm|_cdecl|__except|_export|_far16|_fastcall|__finally|_fortran|_import|_pascal|_stdcall|__thread|__try|asm|auto|break|case|catch|cdecl|const|continue|default|do|else|enum|extern|for|goto|if|pascal|register|return|sizeof|static|struct|switch|typedef|union|volatile|while)\b/g,
						"sh_keyword", -1 ],
				[
						/\b(?:bool|char|double|float|int|long|short|signed|unsigned|void|wchar_t)\b/g,
						"sh_type", -1 ],
				[ /~|!|%|\^|\*|\(|\)|-|\+|=|\[|\]|\\|:|;|,|\.|\/|\?|&|<|>|\|/g,
						"sh_symbol", -1 ],
				[ /\{|\}/g, "sh_cbracket", -1 ],
				[ /(?:[A-Za-z]|_)[A-Za-z0-9_]*(?=[ \t]*\()/g, "sh_function", -1 ],
				[
						/([A-Za-z](?:[^`~!@#$%&*()_=+{}|;:",<.>\/?'\\[\]\^\-\s]|[_])*)((?:<.*>)?)(\s+(?=[*&]*[A-Za-z][^`~!@#$%&*()_=+{}|;:",<.>\/?'\\[\]\^\-\s]*\s*[`~!@#$%&*()_=+{}|;:",<.>\/?'\\[\]\^\-\[\]]+))/g,
						[ "sh_usertype", "sh_usertype", "sh_normal" ], -1 ] ],
		[
				[ /$/g, null, -2 ],
				[
						/(?:<?)[A-Za-z0-9_\.\/\-_~]+@[A-Za-z0-9_\.\/\-_~]+(?:>?)|(?:<?)[A-Za-z0-9_]+:\/\/[A-Za-z0-9_\.\/\-_~]+(?:>?)/g,
						"sh_url", -1 ],
				[ /<\?xml/g, "sh_preproc", 2, 1 ],
				[ /<!DOCTYPE/g, "sh_preproc", 4, 1 ],
				[ /<!--/g, "sh_comment", 5 ],
				[ /<(?:\/)?[A-Za-z](?:[A-Za-z0-9_:.-]*)(?:\/)?>/g,
						"sh_keyword", -1 ],
				[ /<(?:\/)?[A-Za-z](?:[A-Za-z0-9_:.-]*)/g, "sh_keyword", 6, 1 ],
				[ /&(?:[A-Za-z0-9]+);/g, "sh_preproc", -1 ],
				[ /<(?:\/)?[A-Za-z][A-Za-z0-9]*(?:\/)?>/g, "sh_keyword", -1 ],
				[ /<(?:\/)?[A-Za-z][A-Za-z0-9]*/g, "sh_keyword", 6, 1 ],
				[ /@[A-Za-z]+/g, "sh_type", -1 ],
				[ /(?:TODO|FIXME|BUG)(?:[:]?)/g, "sh_todo", -1 ] ],
		[
				[ /\?>/g, "sh_preproc", -2 ],
				[ /([^=" \t>]+)([ \t]*)(=?)/g,
						[ "sh_type", "sh_normal", "sh_symbol" ], -1 ],
				[ /"/g, "sh_string", 3 ] ],
		[ [ /\\(?:\\|")/g, null, -1 ], [ /"/g, "sh_string", -2 ] ],
		[
				[ />/g, "sh_preproc", -2 ],
				[ /([^=" \t>]+)([ \t]*)(=?)/g,
						[ "sh_type", "sh_normal", "sh_symbol" ], -1 ],
				[ /"/g, "sh_string", 3 ] ],
		[ [ /-->/g, "sh_comment", -2 ], [ /<!--/g, "sh_comment", 5 ] ],
		[
				[ /(?:\/)?>/g, "sh_keyword", -2 ],
				[ /([^=" \t>]+)([ \t]*)(=?)/g,
						[ "sh_type", "sh_normal", "sh_symbol" ], -1 ],
				[ /"/g, "sh_string", 3 ] ],
		[ [ /$/g, null, -2 ] ],
		[
				[ /\*\//g, "sh_comment", -2 ],
				[
						/(?:<?)[A-Za-z0-9_\.\/\-_~]+@[A-Za-z0-9_\.\/\-_~]+(?:>?)|(?:<?)[A-Za-z0-9_]+:\/\/[A-Za-z0-9_\.\/\-_~]+(?:>?)/g,
						"sh_url", -1 ],
				[ /<\?xml/g, "sh_preproc", 2, 1 ],
				[ /<!DOCTYPE/g, "sh_preproc", 4, 1 ],
				[ /<!--/g, "sh_comment", 5 ],
				[ /<(?:\/)?[A-Za-z](?:[A-Za-z0-9_:.-]*)(?:\/)?>/g,
						"sh_keyword", -1 ],
				[ /<(?:\/)?[A-Za-z](?:[A-Za-z0-9_:.-]*)/g, "sh_keyword", 6, 1 ],
				[ /&(?:[A-Za-z0-9]+);/g, "sh_preproc", -1 ],
				[ /<(?:\/)?[A-Za-z][A-Za-z0-9]*(?:\/)?>/g, "sh_keyword", -1 ],
				[ /<(?:\/)?[A-Za-z][A-Za-z0-9]*/g, "sh_keyword", 6, 1 ],
				[ /@[A-Za-z]+/g, "sh_type", -1 ],
				[ /(?:TODO|FIXME|BUG)(?:[:]?)/g, "sh_todo", -1 ] ],
		[
				[ /\*\//g, "sh_comment", -2 ],
				[
						/(?:<?)[A-Za-z0-9_\.\/\-_~]+@[A-Za-z0-9_\.\/\-_~]+(?:>?)|(?:<?)[A-Za-z0-9_]+:\/\/[A-Za-z0-9_\.\/\-_~]+(?:>?)/g,
						"sh_url", -1 ],
				[ /(?:TODO|FIXME|BUG)(?:[:]?)/g, "sh_todo", -1 ] ],
		[ [ /$/g, null, -2 ], [ /</g, "sh_string", 11 ],
				[ /"/g, "sh_string", 12 ], [ /\/\/\//g, "sh_comment", 1 ],
				[ /\/\//g, "sh_comment", 7 ], [ /\/\*\*/g, "sh_comment", 8 ],
				[ /\/\*/g, "sh_comment", 9 ] ],
		[ [ /$/g, null, -2 ], [ />/g, "sh_string", -2 ] ],
		[ [ /$/g, null, -2 ], [ /\\(?:\\|")/g, null, -1 ],
				[ /"/g, "sh_string", -2 ] ],
		[ [ /"/g, "sh_string", -2 ], [ /\\./g, "sh_specialchar", -1 ] ],
		[ [ /'/g, "sh_string", -2 ], [ /\\./g, "sh_specialchar", -1 ] ] ];

/* C Sharp language (http://shjs.sourceforge.net/lang/sh_csharp.min.js) */
if (!this.sh_languages) {
	this.sh_languages = {}
}
sh_languages.csharp = [
		[
				[ /\b(?:using)\b/g, "sh_preproc", -1 ],
				[
						/\b[+-]?(?:(?:0x[A-Fa-f0-9]+)|(?:(?:[\d]*\.)?[\d]+(?:[eE][+-]?[\d]+)?))(?:[FfDdMmUulL]+)?\b/g,
						"sh_number", -1 ],
				[ /(\b(?:class|struct|typename))([ \t]+)([A-Za-z0-9_]+)/g,
						[ "sh_keyword", "sh_normal", "sh_classname" ], -1 ],
				[
						/\b(?:abstract|event|new|struct|as|explicit|null|switch|base|extern|this|false|operator|throw|break|finally|out|true|fixed|override|try|case|params|typeof|catch|for|private|foreach|protected|checked|goto|public|unchecked|class|if|readonly|unsafe|const|implicit|ref|continue|in|return|virtual|default|interface|sealed|volatile|delegate|internal|do|is|sizeof|while|lock|stackalloc|else|static|enum|namespace|get|partial|set|value|where|yield)\b/g,
						"sh_keyword", -1 ],
				[ /\/\/\//g, "sh_comment", 1 ],
				[ /\/\//g, "sh_comment", 7 ],
				[ /\/\*\*/g, "sh_comment", 8 ],
				[ /\/\*/g, "sh_comment", 9 ],
				[ /(\bstruct)([ \t]+)([A-Za-z0-9_]+)/g,
						[ "sh_keyword", "sh_normal", "sh_classname" ], -1 ],
				[ /^[ \t]*#(?:[ \t]*include)/g, "sh_preproc", 10, 1 ],
				[ /^[ \t]*#(?:[ \t]*[A-Za-z0-9_]*)/g, "sh_preproc", -1 ],
				[
						/\b[+-]?(?:(?:0x[A-Fa-f0-9]+)|(?:(?:[\d]*\.)?[\d]+(?:[eE][+-]?[\d]+)?))u?(?:(?:int(?:8|16|32|64))|L)?\b/g,
						"sh_number", -1 ],
				[ /"/g, "sh_string", 13 ],
				[ /'/g, "sh_string", 14 ],
				[
						/\b(?:bool|byte|sbyte|char|decimal|double|float|int|uint|long|ulong|object|short|ushort|string|void)\b/g,
						"sh_type", -1 ],
				[ /~|!|%|\^|\*|\(|\)|-|\+|=|\[|\]|\\|:|;|,|\.|\/|\?|&|<|>|\|/g,
						"sh_symbol", -1 ],
				[ /\{|\}/g, "sh_cbracket", -1 ],
				[ /(?:[A-Za-z]|_)[A-Za-z0-9_]*(?=[ \t]*\()/g, "sh_function", -1 ],
				[
						/([A-Za-z](?:[^`~!@#$%&*()_=+{}|;:",<.>\/?'\\[\]\^\-\s]|[_])*)((?:<.*>)?)(\s+(?=[*&]*[A-Za-z][^`~!@#$%&*()_=+{}|;:",<.>\/?'\\[\]\^\-\s]*\s*[`~!@#$%&*()_=+{}|;:",<.>\/?'\\[\]\^\-\[\]]+))/g,
						[ "sh_usertype", "sh_usertype", "sh_normal" ], -1 ] ],
		[
				[ /$/g, null, -2 ],
				[
						/(?:<?)[A-Za-z0-9_\.\/\-_~]+@[A-Za-z0-9_\.\/\-_~]+(?:>?)|(?:<?)[A-Za-z0-9_]+:\/\/[A-Za-z0-9_\.\/\-_~]+(?:>?)/g,
						"sh_url", -1 ],
				[ /<\?xml/g, "sh_preproc", 2, 1 ],
				[ /<!DOCTYPE/g, "sh_preproc", 4, 1 ],
				[ /<!--/g, "sh_comment", 5 ],
				[ /<(?:\/)?[A-Za-z](?:[A-Za-z0-9_:.-]*)(?:\/)?>/g,
						"sh_keyword", -1 ],
				[ /<(?:\/)?[A-Za-z](?:[A-Za-z0-9_:.-]*)/g, "sh_keyword", 6, 1 ],
				[ /&(?:[A-Za-z0-9]+);/g, "sh_preproc", -1 ],
				[ /<(?:\/)?[A-Za-z][A-Za-z0-9]*(?:\/)?>/g, "sh_keyword", -1 ],
				[ /<(?:\/)?[A-Za-z][A-Za-z0-9]*/g, "sh_keyword", 6, 1 ],
				[ /@[A-Za-z]+/g, "sh_type", -1 ],
				[ /(?:TODO|FIXME|BUG)(?:[:]?)/g, "sh_todo", -1 ] ],
		[
				[ /\?>/g, "sh_preproc", -2 ],
				[ /([^=" \t>]+)([ \t]*)(=?)/g,
						[ "sh_type", "sh_normal", "sh_symbol" ], -1 ],
				[ /"/g, "sh_string", 3 ] ],
		[ [ /\\(?:\\|")/g, null, -1 ], [ /"/g, "sh_string", -2 ] ],
		[
				[ />/g, "sh_preproc", -2 ],
				[ /([^=" \t>]+)([ \t]*)(=?)/g,
						[ "sh_type", "sh_normal", "sh_symbol" ], -1 ],
				[ /"/g, "sh_string", 3 ] ],
		[ [ /-->/g, "sh_comment", -2 ], [ /<!--/g, "sh_comment", 5 ] ],
		[
				[ /(?:\/)?>/g, "sh_keyword", -2 ],
				[ /([^=" \t>]+)([ \t]*)(=?)/g,
						[ "sh_type", "sh_normal", "sh_symbol" ], -1 ],
				[ /"/g, "sh_string", 3 ] ],
		[ [ /$/g, null, -2 ] ],
		[
				[ /\*\//g, "sh_comment", -2 ],
				[
						/(?:<?)[A-Za-z0-9_\.\/\-_~]+@[A-Za-z0-9_\.\/\-_~]+(?:>?)|(?:<?)[A-Za-z0-9_]+:\/\/[A-Za-z0-9_\.\/\-_~]+(?:>?)/g,
						"sh_url", -1 ],
				[ /<\?xml/g, "sh_preproc", 2, 1 ],
				[ /<!DOCTYPE/g, "sh_preproc", 4, 1 ],
				[ /<!--/g, "sh_comment", 5 ],
				[ /<(?:\/)?[A-Za-z](?:[A-Za-z0-9_:.-]*)(?:\/)?>/g,
						"sh_keyword", -1 ],
				[ /<(?:\/)?[A-Za-z](?:[A-Za-z0-9_:.-]*)/g, "sh_keyword", 6, 1 ],
				[ /&(?:[A-Za-z0-9]+);/g, "sh_preproc", -1 ],
				[ /<(?:\/)?[A-Za-z][A-Za-z0-9]*(?:\/)?>/g, "sh_keyword", -1 ],
				[ /<(?:\/)?[A-Za-z][A-Za-z0-9]*/g, "sh_keyword", 6, 1 ],
				[ /@[A-Za-z]+/g, "sh_type", -1 ],
				[ /(?:TODO|FIXME|BUG)(?:[:]?)/g, "sh_todo", -1 ] ],
		[
				[ /\*\//g, "sh_comment", -2 ],
				[
						/(?:<?)[A-Za-z0-9_\.\/\-_~]+@[A-Za-z0-9_\.\/\-_~]+(?:>?)|(?:<?)[A-Za-z0-9_]+:\/\/[A-Za-z0-9_\.\/\-_~]+(?:>?)/g,
						"sh_url", -1 ],
				[ /(?:TODO|FIXME|BUG)(?:[:]?)/g, "sh_todo", -1 ] ],
		[ [ /$/g, null, -2 ], [ /</g, "sh_string", 11 ],
				[ /"/g, "sh_string", 12 ], [ /\/\/\//g, "sh_comment", 1 ],
				[ /\/\//g, "sh_comment", 7 ], [ /\/\*\*/g, "sh_comment", 8 ],
				[ /\/\*/g, "sh_comment", 9 ] ],
		[ [ /$/g, null, -2 ], [ />/g, "sh_string", -2 ] ],
		[ [ /$/g, null, -2 ], [ /\\(?:\\|")/g, null, -1 ],
				[ /"/g, "sh_string", -2 ] ],
		[ [ /"/g, "sh_string", -2 ], [ /\\./g, "sh_specialchar", -1 ] ],
		[ [ /'/g, "sh_string", -2 ], [ /\\./g, "sh_specialchar", -1 ] ] ];

/* CSS language (http://shjs.sourceforge.net/lang/sh_css.min.js) */
if (!this.sh_languages) {
	this.sh_languages = {}
}
sh_languages.css = [
		[
				[ /\/\/\//g, "sh_comment", 1 ],
				[ /\/\//g, "sh_comment", 7 ],
				[ /\/\*\*/g, "sh_comment", 8 ],
				[ /\/\*/g, "sh_comment", 9 ],
				[ /(?:\.|#)[A-Za-z0-9_]+/g, "sh_selector", -1 ],
				[ /\{/g, "sh_cbracket", 10, 1 ],
				[ /~|!|%|\^|\*|\(|\)|-|\+|=|\[|\]|\\|:|;|,|\.|\/|\?|&|<|>|\|/g,
						"sh_symbol", -1 ] ],
		[
				[ /$/g, null, -2 ],
				[
						/(?:<?)[A-Za-z0-9_\.\/\-_~]+@[A-Za-z0-9_\.\/\-_~]+(?:>?)|(?:<?)[A-Za-z0-9_]+:\/\/[A-Za-z0-9_\.\/\-_~]+(?:>?)/g,
						"sh_url", -1 ],
				[ /<\?xml/g, "sh_preproc", 2, 1 ],
				[ /<!DOCTYPE/g, "sh_preproc", 4, 1 ],
				[ /<!--/g, "sh_comment", 5 ],
				[ /<(?:\/)?[A-Za-z](?:[A-Za-z0-9_:.-]*)(?:\/)?>/g,
						"sh_keyword", -1 ],
				[ /<(?:\/)?[A-Za-z](?:[A-Za-z0-9_:.-]*)/g, "sh_keyword", 6, 1 ],
				[ /&(?:[A-Za-z0-9]+);/g, "sh_preproc", -1 ],
				[ /<(?:\/)?[A-Za-z][A-Za-z0-9]*(?:\/)?>/g, "sh_keyword", -1 ],
				[ /<(?:\/)?[A-Za-z][A-Za-z0-9]*/g, "sh_keyword", 6, 1 ],
				[ /@[A-Za-z]+/g, "sh_type", -1 ],
				[ /(?:TODO|FIXME|BUG)(?:[:]?)/g, "sh_todo", -1 ] ],
		[
				[ /\?>/g, "sh_preproc", -2 ],
				[ /([^=" \t>]+)([ \t]*)(=?)/g,
						[ "sh_type", "sh_normal", "sh_symbol" ], -1 ],
				[ /"/g, "sh_string", 3 ] ],
		[ [ /\\(?:\\|")/g, null, -1 ], [ /"/g, "sh_string", -2 ] ],
		[
				[ />/g, "sh_preproc", -2 ],
				[ /([^=" \t>]+)([ \t]*)(=?)/g,
						[ "sh_type", "sh_normal", "sh_symbol" ], -1 ],
				[ /"/g, "sh_string", 3 ] ],
		[ [ /-->/g, "sh_comment", -2 ], [ /<!--/g, "sh_comment", 5 ] ],
		[
				[ /(?:\/)?>/g, "sh_keyword", -2 ],
				[ /([^=" \t>]+)([ \t]*)(=?)/g,
						[ "sh_type", "sh_normal", "sh_symbol" ], -1 ],
				[ /"/g, "sh_string", 3 ] ],
		[ [ /$/g, null, -2 ] ],
		[
				[ /\*\//g, "sh_comment", -2 ],
				[
						/(?:<?)[A-Za-z0-9_\.\/\-_~]+@[A-Za-z0-9_\.\/\-_~]+(?:>?)|(?:<?)[A-Za-z0-9_]+:\/\/[A-Za-z0-9_\.\/\-_~]+(?:>?)/g,
						"sh_url", -1 ],
				[ /<\?xml/g, "sh_preproc", 2, 1 ],
				[ /<!DOCTYPE/g, "sh_preproc", 4, 1 ],
				[ /<!--/g, "sh_comment", 5 ],
				[ /<(?:\/)?[A-Za-z](?:[A-Za-z0-9_:.-]*)(?:\/)?>/g,
						"sh_keyword", -1 ],
				[ /<(?:\/)?[A-Za-z](?:[A-Za-z0-9_:.-]*)/g, "sh_keyword", 6, 1 ],
				[ /&(?:[A-Za-z0-9]+);/g, "sh_preproc", -1 ],
				[ /<(?:\/)?[A-Za-z][A-Za-z0-9]*(?:\/)?>/g, "sh_keyword", -1 ],
				[ /<(?:\/)?[A-Za-z][A-Za-z0-9]*/g, "sh_keyword", 6, 1 ],
				[ /@[A-Za-z]+/g, "sh_type", -1 ],
				[ /(?:TODO|FIXME|BUG)(?:[:]?)/g, "sh_todo", -1 ] ],
		[
				[ /\*\//g, "sh_comment", -2 ],
				[
						/(?:<?)[A-Za-z0-9_\.\/\-_~]+@[A-Za-z0-9_\.\/\-_~]+(?:>?)|(?:<?)[A-Za-z0-9_]+:\/\/[A-Za-z0-9_\.\/\-_~]+(?:>?)/g,
						"sh_url", -1 ],
				[ /(?:TODO|FIXME|BUG)(?:[:]?)/g, "sh_todo", -1 ] ],
		[ [ /\}/g, "sh_cbracket", -2 ], [ /\/\/\//g, "sh_comment", 1 ],
				[ /\/\//g, "sh_comment", 7 ], [ /\/\*\*/g, "sh_comment", 8 ],
				[ /\/\*/g, "sh_comment", 9 ],
				[ /[A-Za-z0-9_-]+[ \t]*:/g, "sh_property", -1 ],
				[ /[.%A-Za-z0-9_-]+/g, "sh_value", -1 ],
				[ /#(?:[A-Za-z0-9_]+)/g, "sh_string", -1 ] ] ];

/* Flex language (http://shjs.sourceforge.net/lang/sh_flex.min.js) */
if (!this.sh_languages) {
	this.sh_languages = {}
}
sh_languages.flex = [
		[ [ /^%\{/g, "sh_preproc", 1, 1 ], [ /^%[sx]/g, "sh_preproc", 16, 1 ],
				[ /^%option/g, "sh_preproc", 17, 1 ],
				[ /^%(?:array|pointer|[aceknopr])/g, "sh_preproc", -1 ],
				[ /[A-Za-z_][A-Za-z0-9_-]*/g, "sh_preproc", 19, 1 ],
				[ /^%%/g, "sh_preproc", 20, 1 ] ],
		[
				[ /^%\}/g, "sh_preproc", -2 ],
				[ /(\b(?:class|struct|typename))([ \t]+)([A-Za-z0-9_]+)/g,
						[ "sh_keyword", "sh_normal", "sh_classname" ], -1 ],
				[
						/\b(?:class|const_cast|delete|dynamic_cast|explicit|false|friend|inline|mutable|namespace|new|operator|private|protected|public|reinterpret_cast|static_cast|template|this|throw|true|try|typeid|typename|using|virtual)\b/g,
						"sh_keyword", -1 ],
				[ /\/\/\//g, "sh_comment", 2 ],
				[ /\/\//g, "sh_comment", 8 ],
				[ /\/\*\*/g, "sh_comment", 9 ],
				[ /\/\*/g, "sh_comment", 10 ],
				[ /(\bstruct)([ \t]+)([A-Za-z0-9_]+)/g,
						[ "sh_keyword", "sh_normal", "sh_classname" ], -1 ],
				[ /^[ \t]*#(?:[ \t]*include)/g, "sh_preproc", 11, 1 ],
				[ /^[ \t]*#(?:[ \t]*[A-Za-z0-9_]*)/g, "sh_preproc", -1 ],
				[
						/\b[+-]?(?:(?:0x[A-Fa-f0-9]+)|(?:(?:[\d]*\.)?[\d]+(?:[eE][+-]?[\d]+)?))u?(?:(?:int(?:8|16|32|64))|L)?\b/g,
						"sh_number", -1 ],
				[ /"/g, "sh_string", 14 ],
				[ /'/g, "sh_string", 15 ],
				[
						/\b(?:__asm|__cdecl|__declspec|__export|__far16|__fastcall|__fortran|__import|__pascal|__rtti|__stdcall|_asm|_cdecl|__except|_export|_far16|_fastcall|__finally|_fortran|_import|_pascal|_stdcall|__thread|__try|asm|auto|break|case|catch|cdecl|const|continue|default|do|else|enum|extern|for|goto|if|pascal|register|return|sizeof|static|struct|switch|typedef|union|volatile|while)\b/g,
						"sh_keyword", -1 ],
				[
						/\b(?:bool|char|double|float|int|long|short|signed|unsigned|void|wchar_t)\b/g,
						"sh_type", -1 ],
				[ /~|!|%|\^|\*|\(|\)|-|\+|=|\[|\]|\\|:|;|,|\.|\/|\?|&|<|>|\|/g,
						"sh_symbol", -1 ],
				[ /\{|\}/g, "sh_cbracket", -1 ],
				[ /(?:[A-Za-z]|_)[A-Za-z0-9_]*(?=[ \t]*\()/g, "sh_function", -1 ],
				[
						/([A-Za-z](?:[^`~!@#$%&*()_=+{}|;:",<.>\/?'\\[\]\^\-\s]|[_])*)((?:<.*>)?)(\s+(?=[*&]*[A-Za-z][^`~!@#$%&*()_=+{}|;:",<.>\/?'\\[\]\^\-\s]*\s*[`~!@#$%&*()_=+{}|;:",<.>\/?'\\[\]\^\-\[\]]+))/g,
						[ "sh_usertype", "sh_usertype", "sh_normal" ], -1 ] ],
		[
				[ /$/g, null, -2 ],
				[
						/(?:<?)[A-Za-z0-9_\.\/\-_~]+@[A-Za-z0-9_\.\/\-_~]+(?:>?)|(?:<?)[A-Za-z0-9_]+:\/\/[A-Za-z0-9_\.\/\-_~]+(?:>?)/g,
						"sh_url", -1 ],
				[ /<\?xml/g, "sh_preproc", 3, 1 ],
				[ /<!DOCTYPE/g, "sh_preproc", 5, 1 ],
				[ /<!--/g, "sh_comment", 6 ],
				[ /<(?:\/)?[A-Za-z](?:[A-Za-z0-9_:.-]*)(?:\/)?>/g,
						"sh_keyword", -1 ],
				[ /<(?:\/)?[A-Za-z](?:[A-Za-z0-9_:.-]*)/g, "sh_keyword", 7, 1 ],
				[ /&(?:[A-Za-z0-9]+);/g, "sh_preproc", -1 ],
				[ /<(?:\/)?[A-Za-z][A-Za-z0-9]*(?:\/)?>/g, "sh_keyword", -1 ],
				[ /<(?:\/)?[A-Za-z][A-Za-z0-9]*/g, "sh_keyword", 7, 1 ],
				[ /@[A-Za-z]+/g, "sh_type", -1 ],
				[ /(?:TODO|FIXME|BUG)(?:[:]?)/g, "sh_todo", -1 ] ],
		[
				[ /\?>/g, "sh_preproc", -2 ],
				[ /([^=" \t>]+)([ \t]*)(=?)/g,
						[ "sh_type", "sh_normal", "sh_symbol" ], -1 ],
				[ /"/g, "sh_string", 4 ] ],
		[ [ /\\(?:\\|")/g, null, -1 ], [ /"/g, "sh_string", -2 ] ],
		[
				[ />/g, "sh_preproc", -2 ],
				[ /([^=" \t>]+)([ \t]*)(=?)/g,
						[ "sh_type", "sh_normal", "sh_symbol" ], -1 ],
				[ /"/g, "sh_string", 4 ] ],
		[ [ /-->/g, "sh_comment", -2 ], [ /<!--/g, "sh_comment", 6 ] ],
		[
				[ /(?:\/)?>/g, "sh_keyword", -2 ],
				[ /([^=" \t>]+)([ \t]*)(=?)/g,
						[ "sh_type", "sh_normal", "sh_symbol" ], -1 ],
				[ /"/g, "sh_string", 4 ] ],
		[ [ /$/g, null, -2 ] ],
		[
				[ /\*\//g, "sh_comment", -2 ],
				[
						/(?:<?)[A-Za-z0-9_\.\/\-_~]+@[A-Za-z0-9_\.\/\-_~]+(?:>?)|(?:<?)[A-Za-z0-9_]+:\/\/[A-Za-z0-9_\.\/\-_~]+(?:>?)/g,
						"sh_url", -1 ],
				[ /<\?xml/g, "sh_preproc", 3, 1 ],
				[ /<!DOCTYPE/g, "sh_preproc", 5, 1 ],
				[ /<!--/g, "sh_comment", 6 ],
				[ /<(?:\/)?[A-Za-z](?:[A-Za-z0-9_:.-]*)(?:\/)?>/g,
						"sh_keyword", -1 ],
				[ /<(?:\/)?[A-Za-z](?:[A-Za-z0-9_:.-]*)/g, "sh_keyword", 7, 1 ],
				[ /&(?:[A-Za-z0-9]+);/g, "sh_preproc", -1 ],
				[ /<(?:\/)?[A-Za-z][A-Za-z0-9]*(?:\/)?>/g, "sh_keyword", -1 ],
				[ /<(?:\/)?[A-Za-z][A-Za-z0-9]*/g, "sh_keyword", 7, 1 ],
				[ /@[A-Za-z]+/g, "sh_type", -1 ],
				[ /(?:TODO|FIXME|BUG)(?:[:]?)/g, "sh_todo", -1 ] ],
		[
				[ /\*\//g, "sh_comment", -2 ],
				[
						/(?:<?)[A-Za-z0-9_\.\/\-_~]+@[A-Za-z0-9_\.\/\-_~]+(?:>?)|(?:<?)[A-Za-z0-9_]+:\/\/[A-Za-z0-9_\.\/\-_~]+(?:>?)/g,
						"sh_url", -1 ],
				[ /(?:TODO|FIXME|BUG)(?:[:]?)/g, "sh_todo", -1 ] ],
		[ [ /$/g, null, -2 ], [ /</g, "sh_string", 12 ],
				[ /"/g, "sh_string", 13 ], [ /\/\/\//g, "sh_comment", 2 ],
				[ /\/\//g, "sh_comment", 8 ], [ /\/\*\*/g, "sh_comment", 9 ],
				[ /\/\*/g, "sh_comment", 10 ] ],
		[ [ /$/g, null, -2 ], [ />/g, "sh_string", -2 ] ],
		[ [ /$/g, null, -2 ], [ /\\(?:\\|")/g, null, -1 ],
				[ /"/g, "sh_string", -2 ] ],
		[ [ /"/g, "sh_string", -2 ], [ /\\./g, "sh_specialchar", -1 ] ],
		[ [ /'/g, "sh_string", -2 ], [ /\\./g, "sh_specialchar", -1 ] ],
		[ [ /$/g, null, -2 ], [ /[A-Za-z_][A-Za-z0-9_-]*/g, "sh_function", -1 ] ],
		[ [ /$/g, null, -2 ], [ /[A-Za-z_][A-Za-z0-9_-]*/g, "sh_keyword", -1 ],
				[ /"/g, "sh_string", 18 ], [ /=/g, "sh_symbol", -1 ] ],
		[ [ /$/g, null, -2 ], [ /"/g, "sh_string", -2 ] ],
		[
				[ /$/g, null, -2 ],
				[ /\{[A-Za-z_][A-Za-z0-9_-]*\}/g, "sh_type", -1 ],
				[ /"/g, "sh_string", 13 ],
				[ /~|!|%|\^|\*|\(|\)|-|\+|=|\[|\]|\\|:|;|,|\.|\/|\?|&|<|>|\|/g,
						"sh_symbol", -1 ] ],
		[
				[ /^%%/g, "sh_preproc", 21, 1 ],
				[ /<[A-Za-z_][A-Za-z0-9_-]*>/g, "sh_function", -1 ],
				[ /"/g, "sh_string", 13 ],
				[ /\\./g, "sh_preproc", -1 ],
				[ /\{[A-Za-z_][A-Za-z0-9_-]*\}/g, "sh_type", -1 ],
				[ /\/\*/g, "sh_comment", 22 ],
				[ /\{/g, "sh_cbracket", 23, 1 ],
				[ /~|!|%|\^|\*|\(|\)|-|\+|=|\[|\]|\\|:|;|,|\.|\/|\?|&|<|>|\|/g,
						"sh_symbol", -1 ] ],
		[
				[ /(\b(?:class|struct|typename))([ \t]+)([A-Za-z0-9_]+)/g,
						[ "sh_keyword", "sh_normal", "sh_classname" ], -1 ],
				[
						/\b(?:class|const_cast|delete|dynamic_cast|explicit|false|friend|inline|mutable|namespace|new|operator|private|protected|public|reinterpret_cast|static_cast|template|this|throw|true|try|typeid|typename|using|virtual)\b/g,
						"sh_keyword", -1 ],
				[ /\/\/\//g, "sh_comment", 2 ],
				[ /\/\//g, "sh_comment", 8 ],
				[ /\/\*\*/g, "sh_comment", 9 ],
				[ /\/\*/g, "sh_comment", 10 ],
				[ /(\bstruct)([ \t]+)([A-Za-z0-9_]+)/g,
						[ "sh_keyword", "sh_normal", "sh_classname" ], -1 ],
				[ /^[ \t]*#(?:[ \t]*include)/g, "sh_preproc", 11, 1 ],
				[ /^[ \t]*#(?:[ \t]*[A-Za-z0-9_]*)/g, "sh_preproc", -1 ],
				[
						/\b[+-]?(?:(?:0x[A-Fa-f0-9]+)|(?:(?:[\d]*\.)?[\d]+(?:[eE][+-]?[\d]+)?))u?(?:(?:int(?:8|16|32|64))|L)?\b/g,
						"sh_number", -1 ],
				[ /"/g, "sh_string", 14 ],
				[ /'/g, "sh_string", 15 ],
				[
						/\b(?:__asm|__cdecl|__declspec|__export|__far16|__fastcall|__fortran|__import|__pascal|__rtti|__stdcall|_asm|_cdecl|__except|_export|_far16|_fastcall|__finally|_fortran|_import|_pascal|_stdcall|__thread|__try|asm|auto|break|case|catch|cdecl|const|continue|default|do|else|enum|extern|for|goto|if|pascal|register|return|sizeof|static|struct|switch|typedef|union|volatile|while)\b/g,
						"sh_keyword", -1 ],
				[
						/\b(?:bool|char|double|float|int|long|short|signed|unsigned|void|wchar_t)\b/g,
						"sh_type", -1 ],
				[ /~|!|%|\^|\*|\(|\)|-|\+|=|\[|\]|\\|:|;|,|\.|\/|\?|&|<|>|\|/g,
						"sh_symbol", -1 ],
				[ /\{|\}/g, "sh_cbracket", -1 ],
				[ /(?:[A-Za-z]|_)[A-Za-z0-9_]*(?=[ \t]*\()/g, "sh_function", -1 ],
				[
						/([A-Za-z](?:[^`~!@#$%&*()_=+{}|;:",<.>\/?'\\[\]\^\-\s]|[_])*)((?:<.*>)?)(\s+(?=[*&]*[A-Za-z][^`~!@#$%&*()_=+{}|;:",<.>\/?'\\[\]\^\-\s]*\s*[`~!@#$%&*()_=+{}|;:",<.>\/?'\\[\]\^\-\[\]]+))/g,
						[ "sh_usertype", "sh_usertype", "sh_normal" ], -1 ] ],
		[ [ /\*\//g, "sh_comment", -2 ], [ /\/\*/g, "sh_comment", 22 ] ],
		[
				[ /\}/g, "sh_cbracket", -2 ],
				[ /\{/g, "sh_cbracket", 23, 1 ],
				[ /\$./g, "sh_variable", -1 ],
				[ /(\b(?:class|struct|typename))([ \t]+)([A-Za-z0-9_]+)/g,
						[ "sh_keyword", "sh_normal", "sh_classname" ], -1 ],
				[
						/\b(?:class|const_cast|delete|dynamic_cast|explicit|false|friend|inline|mutable|namespace|new|operator|private|protected|public|reinterpret_cast|static_cast|template|this|throw|true|try|typeid|typename|using|virtual)\b/g,
						"sh_keyword", -1 ],
				[ /\/\/\//g, "sh_comment", 2 ],
				[ /\/\//g, "sh_comment", 8 ],
				[ /\/\*\*/g, "sh_comment", 9 ],
				[ /\/\*/g, "sh_comment", 10 ],
				[ /(\bstruct)([ \t]+)([A-Za-z0-9_]+)/g,
						[ "sh_keyword", "sh_normal", "sh_classname" ], -1 ],
				[ /^[ \t]*#(?:[ \t]*include)/g, "sh_preproc", 11, 1 ],
				[ /^[ \t]*#(?:[ \t]*[A-Za-z0-9_]*)/g, "sh_preproc", -1 ],
				[
						/\b[+-]?(?:(?:0x[A-Fa-f0-9]+)|(?:(?:[\d]*\.)?[\d]+(?:[eE][+-]?[\d]+)?))u?(?:(?:int(?:8|16|32|64))|L)?\b/g,
						"sh_number", -1 ],
				[ /"/g, "sh_string", 14 ],
				[ /'/g, "sh_string", 15 ],
				[
						/\b(?:__asm|__cdecl|__declspec|__export|__far16|__fastcall|__fortran|__import|__pascal|__rtti|__stdcall|_asm|_cdecl|__except|_export|_far16|_fastcall|__finally|_fortran|_import|_pascal|_stdcall|__thread|__try|asm|auto|break|case|catch|cdecl|const|continue|default|do|else|enum|extern|for|goto|if|pascal|register|return|sizeof|static|struct|switch|typedef|union|volatile|while)\b/g,
						"sh_keyword", -1 ],
				[
						/\b(?:bool|char|double|float|int|long|short|signed|unsigned|void|wchar_t)\b/g,
						"sh_type", -1 ],
				[ /~|!|%|\^|\*|\(|\)|-|\+|=|\[|\]|\\|:|;|,|\.|\/|\?|&|<|>|\|/g,
						"sh_symbol", -1 ],
				[ /\{|\}/g, "sh_cbracket", -1 ],
				[ /(?:[A-Za-z]|_)[A-Za-z0-9_]*(?=[ \t]*\()/g, "sh_function", -1 ],
				[
						/([A-Za-z](?:[^`~!@#$%&*()_=+{}|;:",<.>\/?'\\[\]\^\-\s]|[_])*)((?:<.*>)?)(\s+(?=[*&]*[A-Za-z][^`~!@#$%&*()_=+{}|;:",<.>\/?'\\[\]\^\-\s]*\s*[`~!@#$%&*()_=+{}|;:",<.>\/?'\\[\]\^\-\[\]]+))/g,
						[ "sh_usertype", "sh_usertype", "sh_normal" ], -1 ] ] ];

/* HTML language (http://shjs.sourceforge.net/lang/sh_html.min.js) */
if (!this.sh_languages) {
	this.sh_languages = {}
}
sh_languages.html = [
		[
				[ /<\?xml/g, "sh_preproc", 1, 1 ],
				[ /<!DOCTYPE/g, "sh_preproc", 3, 1 ],
				[ /<!--/g, "sh_comment", 4 ],
				[ /<(?:\/)?[A-Za-z](?:[A-Za-z0-9_:.-]*)(?:\/)?>/g,
						"sh_keyword", -1 ],
				[ /<(?:\/)?[A-Za-z](?:[A-Za-z0-9_:.-]*)/g, "sh_keyword", 5, 1 ],
				[ /&(?:[A-Za-z0-9]+);/g, "sh_preproc", -1 ],
				[ /<(?:\/)?[A-Za-z][A-Za-z0-9]*(?:\/)?>/g, "sh_keyword", -1 ],
				[ /<(?:\/)?[A-Za-z][A-Za-z0-9]*/g, "sh_keyword", 5, 1 ] ],
		[
				[ /\?>/g, "sh_preproc", -2 ],
				[ /([^=" \t>]+)([ \t]*)(=?)/g,
						[ "sh_type", "sh_normal", "sh_symbol" ], -1 ],
				[ /"/g, "sh_string", 2 ] ],
		[ [ /\\(?:\\|")/g, null, -1 ], [ /"/g, "sh_string", -2 ] ],
		[
				[ />/g, "sh_preproc", -2 ],
				[ /([^=" \t>]+)([ \t]*)(=?)/g,
						[ "sh_type", "sh_normal", "sh_symbol" ], -1 ],
				[ /"/g, "sh_string", 2 ] ],
		[ [ /-->/g, "sh_comment", -2 ], [ /<!--/g, "sh_comment", 4 ] ],
		[
				[ /(?:\/)?>/g, "sh_keyword", -2 ],
				[ /([^=" \t>]+)([ \t]*)(=?)/g,
						[ "sh_type", "sh_normal", "sh_symbol" ], -1 ],
				[ /"/g, "sh_string", 2 ] ] ];

/* Java language (http://shjs.sourceforge.net/lang/sh_java.min.js) */
if (!this.sh_languages) {
	this.sh_languages = {}
}
sh_languages.java = [
		[
				[ /\b(?:import|package)\b/g, "sh_preproc", -1 ],
				[ /\/\/\//g, "sh_comment", 1 ],
				[ /\/\//g, "sh_comment", 7 ],
				[ /\/\*\*/g, "sh_comment", 8 ],
				[ /\/\*/g, "sh_comment", 9 ],
				[
						/\b[+-]?(?:(?:0x[A-Fa-f0-9]+)|(?:(?:[\d]*\.)?[\d]+(?:[eE][+-]?[\d]+)?))u?(?:(?:int(?:8|16|32|64))|L)?\b/g,
						"sh_number", -1 ],
				[ /"/g, "sh_string", 10 ],
				[ /'/g, "sh_string", 11 ],
				[ /(\b(?:class|interface))([ \t]+)([$A-Za-z0-9_]+)/g,
						[ "sh_keyword", "sh_normal", "sh_classname" ], -1 ],
				[
						/\b(?:abstract|assert|break|case|catch|class|const|continue|default|do|else|extends|false|final|finally|for|goto|if|implements|instanceof|interface|native|new|null|private|protected|public|return|static|strictfp|super|switch|synchronized|throw|throws|true|this|transient|try|volatile|while)\b/g,
						"sh_keyword", -1 ],
				[
						/\b(?:int|byte|boolean|char|long|float|double|short|void)\b/g,
						"sh_type", -1 ],
				[ /~|!|%|\^|\*|\(|\)|-|\+|=|\[|\]|\\|:|;|,|\.|\/|\?|&|<|>|\|/g,
						"sh_symbol", -1 ],
				[ /\{|\}/g, "sh_cbracket", -1 ],
				[ /(?:[A-Za-z]|_)[A-Za-z0-9_]*(?=[ \t]*\()/g, "sh_function", -1 ],
				[
						/([A-Za-z](?:[^`~!@#$%&*()_=+{}|;:",<.>\/?'\\[\]\^\-\s]|[_])*)((?:<.*>)?)(\s+(?=[*&]*[A-Za-z][^`~!@#$%&*()_=+{}|;:",<.>\/?'\\[\]\^\-\s]*\s*[`~!@#$%&*()_=+{}|;:",<.>\/?'\\[\]\^\-\[\]]+))/g,
						[ "sh_usertype", "sh_usertype", "sh_normal" ], -1 ] ],
		[
				[ /$/g, null, -2 ],
				[
						/(?:<?)[A-Za-z0-9_\.\/\-_~]+@[A-Za-z0-9_\.\/\-_~]+(?:>?)|(?:<?)[A-Za-z0-9_]+:\/\/[A-Za-z0-9_\.\/\-_~]+(?:>?)/g,
						"sh_url", -1 ],
				[ /<\?xml/g, "sh_preproc", 2, 1 ],
				[ /<!DOCTYPE/g, "sh_preproc", 4, 1 ],
				[ /<!--/g, "sh_comment", 5 ],
				[ /<(?:\/)?[A-Za-z](?:[A-Za-z0-9_:.-]*)(?:\/)?>/g,
						"sh_keyword", -1 ],
				[ /<(?:\/)?[A-Za-z](?:[A-Za-z0-9_:.-]*)/g, "sh_keyword", 6, 1 ],
				[ /&(?:[A-Za-z0-9]+);/g, "sh_preproc", -1 ],
				[ /<(?:\/)?[A-Za-z][A-Za-z0-9]*(?:\/)?>/g, "sh_keyword", -1 ],
				[ /<(?:\/)?[A-Za-z][A-Za-z0-9]*/g, "sh_keyword", 6, 1 ],
				[ /@[A-Za-z]+/g, "sh_type", -1 ],
				[ /(?:TODO|FIXME|BUG)(?:[:]?)/g, "sh_todo", -1 ] ],
		[
				[ /\?>/g, "sh_preproc", -2 ],
				[ /([^=" \t>]+)([ \t]*)(=?)/g,
						[ "sh_type", "sh_normal", "sh_symbol" ], -1 ],
				[ /"/g, "sh_string", 3 ] ],
		[ [ /\\(?:\\|")/g, null, -1 ], [ /"/g, "sh_string", -2 ] ],
		[
				[ />/g, "sh_preproc", -2 ],
				[ /([^=" \t>]+)([ \t]*)(=?)/g,
						[ "sh_type", "sh_normal", "sh_symbol" ], -1 ],
				[ /"/g, "sh_string", 3 ] ],
		[ [ /-->/g, "sh_comment", -2 ], [ /<!--/g, "sh_comment", 5 ] ],
		[
				[ /(?:\/)?>/g, "sh_keyword", -2 ],
				[ /([^=" \t>]+)([ \t]*)(=?)/g,
						[ "sh_type", "sh_normal", "sh_symbol" ], -1 ],
				[ /"/g, "sh_string", 3 ] ],
		[ [ /$/g, null, -2 ] ],
		[
				[ /\*\//g, "sh_comment", -2 ],
				[
						/(?:<?)[A-Za-z0-9_\.\/\-_~]+@[A-Za-z0-9_\.\/\-_~]+(?:>?)|(?:<?)[A-Za-z0-9_]+:\/\/[A-Za-z0-9_\.\/\-_~]+(?:>?)/g,
						"sh_url", -1 ],
				[ /<\?xml/g, "sh_preproc", 2, 1 ],
				[ /<!DOCTYPE/g, "sh_preproc", 4, 1 ],
				[ /<!--/g, "sh_comment", 5 ],
				[ /<(?:\/)?[A-Za-z](?:[A-Za-z0-9_:.-]*)(?:\/)?>/g,
						"sh_keyword", -1 ],
				[ /<(?:\/)?[A-Za-z](?:[A-Za-z0-9_:.-]*)/g, "sh_keyword", 6, 1 ],
				[ /&(?:[A-Za-z0-9]+);/g, "sh_preproc", -1 ],
				[ /<(?:\/)?[A-Za-z][A-Za-z0-9]*(?:\/)?>/g, "sh_keyword", -1 ],
				[ /<(?:\/)?[A-Za-z][A-Za-z0-9]*/g, "sh_keyword", 6, 1 ],
				[ /@[A-Za-z]+/g, "sh_type", -1 ],
				[ /(?:TODO|FIXME|BUG)(?:[:]?)/g, "sh_todo", -1 ] ],
		[
				[ /\*\//g, "sh_comment", -2 ],
				[
						/(?:<?)[A-Za-z0-9_\.\/\-_~]+@[A-Za-z0-9_\.\/\-_~]+(?:>?)|(?:<?)[A-Za-z0-9_]+:\/\/[A-Za-z0-9_\.\/\-_~]+(?:>?)/g,
						"sh_url", -1 ],
				[ /(?:TODO|FIXME|BUG)(?:[:]?)/g, "sh_todo", -1 ] ],
		[ [ /"/g, "sh_string", -2 ], [ /\\./g, "sh_specialchar", -1 ] ],
		[ [ /'/g, "sh_string", -2 ], [ /\\./g, "sh_specialchar", -1 ] ] ];

/* Javascript language (http://shjs.sourceforge.net/lang/sh_javascript.min.js) */
if (!this.sh_languages) {
	this.sh_languages = {}
}
sh_languages.javascript = [
		[
				[ /\/\/\//g, "sh_comment", 1 ],
				[ /\/\//g, "sh_comment", 7 ],
				[ /\/\*\*/g, "sh_comment", 8 ],
				[ /\/\*/g, "sh_comment", 9 ],
				[
						/\b(?:abstract|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|false|final|finally|for|function|goto|if|implements|in|instanceof|interface|native|new|null|private|protected|prototype|public|return|static|super|switch|synchronized|throw|throws|this|transient|true|try|typeof|var|volatile|while|with)\b/g,
						"sh_keyword", -1 ],
				[ /(\+\+|--|\)|\])(\s*)(\/=?(?![*\/]))/g,
						[ "sh_symbol", "sh_normal", "sh_symbol" ], -1 ],
				[
						/(0x[A-Fa-f0-9]+|(?:[\d]*\.)?[\d]+(?:[eE][+-]?[\d]+)?)(\s*)(\/(?![*\/]))/g,
						[ "sh_number", "sh_normal", "sh_symbol" ], -1 ],
				[ /([A-Za-z$_][A-Za-z0-9$_]*\s*)(\/=?(?![*\/]))/g,
						[ "sh_normal", "sh_symbol" ], -1 ],
				[ /\/(?:\\.|[^*\\\/])(?:\\.|[^\\\/])*\/[gim]*/g, "sh_regexp",
						-1 ],
				[
						/\b[+-]?(?:(?:0x[A-Fa-f0-9]+)|(?:(?:[\d]*\.)?[\d]+(?:[eE][+-]?[\d]+)?))u?(?:(?:int(?:8|16|32|64))|L)?\b/g,
						"sh_number", -1 ],
				[ /"/g, "sh_string", 10 ],
				[ /'/g, "sh_string", 11 ],
				[ /~|!|%|\^|\*|\(|\)|-|\+|=|\[|\]|\\|:|;|,|\.|\/|\?|&|<|>|\|/g,
						"sh_symbol", -1 ],
				[ /\{|\}/g, "sh_cbracket", -1 ],
				[ /\b(?:Math|Infinity|NaN|undefined|arguments)\b/g,
						"sh_predef_var", -1 ],
				[
						/\b(?:Array|Boolean|Date|Error|EvalError|Function|Number|Object|RangeError|ReferenceError|RegExp|String|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt)\b/g,
						"sh_predef_func", -1 ],
				[ /(?:[A-Za-z]|_)[A-Za-z0-9_]*(?=[ \t]*\()/g, "sh_function", -1 ] ],
		[
				[ /$/g, null, -2 ],
				[
						/(?:<?)[A-Za-z0-9_\.\/\-_~]+@[A-Za-z0-9_\.\/\-_~]+(?:>?)|(?:<?)[A-Za-z0-9_]+:\/\/[A-Za-z0-9_\.\/\-_~]+(?:>?)/g,
						"sh_url", -1 ],
				[ /<\?xml/g, "sh_preproc", 2, 1 ],
				[ /<!DOCTYPE/g, "sh_preproc", 4, 1 ],
				[ /<!--/g, "sh_comment", 5 ],
				[ /<(?:\/)?[A-Za-z](?:[A-Za-z0-9_:.-]*)(?:\/)?>/g,
						"sh_keyword", -1 ],
				[ /<(?:\/)?[A-Za-z](?:[A-Za-z0-9_:.-]*)/g, "sh_keyword", 6, 1 ],
				[ /&(?:[A-Za-z0-9]+);/g, "sh_preproc", -1 ],
				[ /<(?:\/)?[A-Za-z][A-Za-z0-9]*(?:\/)?>/g, "sh_keyword", -1 ],
				[ /<(?:\/)?[A-Za-z][A-Za-z0-9]*/g, "sh_keyword", 6, 1 ],
				[ /@[A-Za-z]+/g, "sh_type", -1 ],
				[ /(?:TODO|FIXME|BUG)(?:[:]?)/g, "sh_todo", -1 ] ],
		[
				[ /\?>/g, "sh_preproc", -2 ],
				[ /([^=" \t>]+)([ \t]*)(=?)/g,
						[ "sh_type", "sh_normal", "sh_symbol" ], -1 ],
				[ /"/g, "sh_string", 3 ] ],
		[ [ /\\(?:\\|")/g, null, -1 ], [ /"/g, "sh_string", -2 ] ],
		[
				[ />/g, "sh_preproc", -2 ],
				[ /([^=" \t>]+)([ \t]*)(=?)/g,
						[ "sh_type", "sh_normal", "sh_symbol" ], -1 ],
				[ /"/g, "sh_string", 3 ] ],
		[ [ /-->/g, "sh_comment", -2 ], [ /<!--/g, "sh_comment", 5 ] ],
		[
				[ /(?:\/)?>/g, "sh_keyword", -2 ],
				[ /([^=" \t>]+)([ \t]*)(=?)/g,
						[ "sh_type", "sh_normal", "sh_symbol" ], -1 ],
				[ /"/g, "sh_string", 3 ] ],
		[ [ /$/g, null, -2 ] ],
		[
				[ /\*\//g, "sh_comment", -2 ],
				[
						/(?:<?)[A-Za-z0-9_\.\/\-_~]+@[A-Za-z0-9_\.\/\-_~]+(?:>?)|(?:<?)[A-Za-z0-9_]+:\/\/[A-Za-z0-9_\.\/\-_~]+(?:>?)/g,
						"sh_url", -1 ],
				[ /<\?xml/g, "sh_preproc", 2, 1 ],
				[ /<!DOCTYPE/g, "sh_preproc", 4, 1 ],
				[ /<!--/g, "sh_comment", 5 ],
				[ /<(?:\/)?[A-Za-z](?:[A-Za-z0-9_:.-]*)(?:\/)?>/g,
						"sh_keyword", -1 ],
				[ /<(?:\/)?[A-Za-z](?:[A-Za-z0-9_:.-]*)/g, "sh_keyword", 6, 1 ],
				[ /&(?:[A-Za-z0-9]+);/g, "sh_preproc", -1 ],
				[ /<(?:\/)?[A-Za-z][A-Za-z0-9]*(?:\/)?>/g, "sh_keyword", -1 ],
				[ /<(?:\/)?[A-Za-z][A-Za-z0-9]*/g, "sh_keyword", 6, 1 ],
				[ /@[A-Za-z]+/g, "sh_type", -1 ],
				[ /(?:TODO|FIXME|BUG)(?:[:]?)/g, "sh_todo", -1 ] ],
		[
				[ /\*\//g, "sh_comment", -2 ],
				[
						/(?:<?)[A-Za-z0-9_\.\/\-_~]+@[A-Za-z0-9_\.\/\-_~]+(?:>?)|(?:<?)[A-Za-z0-9_]+:\/\/[A-Za-z0-9_\.\/\-_~]+(?:>?)/g,
						"sh_url", -1 ],
				[ /(?:TODO|FIXME|BUG)(?:[:]?)/g, "sh_todo", -1 ] ],
		[ [ /"/g, "sh_string", -2 ], [ /\\./g, "sh_specialchar", -1 ] ],
		[ [ /'/g, "sh_string", -2 ], [ /\\./g, "sh_specialchar", -1 ] ] ];

/*
 * Javascript DOM language
 * (http://shjs.sourceforge.net/lang/sh_javascript_dom.min.js)
 */
if (!this.sh_languages) {
	this.sh_languages = {}
}
sh_languages.javascript_dom = [
		[
				[ /\/\/\//g, "sh_comment", 1 ],
				[ /\/\//g, "sh_comment", 7 ],
				[ /\/\*\*/g, "sh_comment", 8 ],
				[ /\/\*/g, "sh_comment", 9 ],
				[
						/\b(?:abstract|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|false|final|finally|for|function|goto|if|implements|in|instanceof|interface|native|new|null|private|protected|prototype|public|return|static|super|switch|synchronized|throw|throws|this|transient|true|try|typeof|var|volatile|while|with)\b/g,
						"sh_keyword", -1 ],
				[ /(\+\+|--|\)|\])(\s*)(\/=?(?![*\/]))/g,
						[ "sh_symbol", "sh_normal", "sh_symbol" ], -1 ],
				[
						/(0x[A-Fa-f0-9]+|(?:[\d]*\.)?[\d]+(?:[eE][+-]?[\d]+)?)(\s*)(\/(?![*\/]))/g,
						[ "sh_number", "sh_normal", "sh_symbol" ], -1 ],
				[ /([A-Za-z$_][A-Za-z0-9$_]*\s*)(\/=?(?![*\/]))/g,
						[ "sh_normal", "sh_symbol" ], -1 ],
				[ /\/(?:\\.|[^*\\\/])(?:\\.|[^\\\/])*\/[gim]*/g, "sh_regexp",
						-1 ],
				[
						/\b[+-]?(?:(?:0x[A-Fa-f0-9]+)|(?:(?:[\d]*\.)?[\d]+(?:[eE][+-]?[\d]+)?))u?(?:(?:int(?:8|16|32|64))|L)?\b/g,
						"sh_number", -1 ],
				[ /"/g, "sh_string", 10 ],
				[ /'/g, "sh_string", 11 ],
				[ /~|!|%|\^|\*|\(|\)|-|\+|=|\[|\]|\\|:|;|,|\.|\/|\?|&|<|>|\|/g,
						"sh_symbol", -1 ],
				[ /\{|\}/g, "sh_cbracket", -1 ],
				[ /\b(?:Math|Infinity|NaN|undefined|arguments)\b/g,
						"sh_predef_var", -1 ],
				[
						/\b(?:Array|Boolean|Date|Error|EvalError|Function|Number|Object|RangeError|ReferenceError|RegExp|String|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt)\b/g,
						"sh_predef_func", -1 ],
				[
						/\b(?:applicationCache|closed|Components|content|controllers|crypto|defaultStatus|dialogArguments|directories|document|frameElement|frames|fullScreen|globalStorage|history|innerHeight|innerWidth|length|location|locationbar|menubar|name|navigator|opener|outerHeight|outerWidth|pageXOffset|pageYOffset|parent|personalbar|pkcs11|returnValue|screen|availTop|availLeft|availHeight|availWidth|colorDepth|height|left|pixelDepth|top|width|screenX|screenY|scrollbars|scrollMaxX|scrollMaxY|scrollX|scrollY|self|sessionStorage|sidebar|status|statusbar|toolbar|top|window)\b/g,
						"sh_predef_var", -1 ],
				[
						/\b(?:alert|addEventListener|atob|back|blur|btoa|captureEvents|clearInterval|clearTimeout|close|confirm|dump|escape|find|focus|forward|getAttention|getComputedStyle|getSelection|home|moveBy|moveTo|open|openDialog|postMessage|print|prompt|releaseEvents|removeEventListener|resizeBy|resizeTo|scroll|scrollBy|scrollByLines|scrollByPages|scrollTo|setInterval|setTimeout|showModalDialog|sizeToContent|stop|unescape|updateCommands|onabort|onbeforeunload|onblur|onchange|onclick|onclose|oncontextmenu|ondragdrop|onerror|onfocus|onkeydown|onkeypress|onkeyup|onload|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|onpaint|onreset|onresize|onscroll|onselect|onsubmit|onunload)\b/g,
						"sh_predef_func", -1 ],
				[ /(?:[A-Za-z]|_)[A-Za-z0-9_]*(?=[ \t]*\()/g, "sh_function", -1 ] ],
		[
				[ /$/g, null, -2 ],
				[
						/(?:<?)[A-Za-z0-9_\.\/\-_~]+@[A-Za-z0-9_\.\/\-_~]+(?:>?)|(?:<?)[A-Za-z0-9_]+:\/\/[A-Za-z0-9_\.\/\-_~]+(?:>?)/g,
						"sh_url", -1 ],
				[ /<\?xml/g, "sh_preproc", 2, 1 ],
				[ /<!DOCTYPE/g, "sh_preproc", 4, 1 ],
				[ /<!--/g, "sh_comment", 5 ],
				[ /<(?:\/)?[A-Za-z](?:[A-Za-z0-9_:.-]*)(?:\/)?>/g,
						"sh_keyword", -1 ],
				[ /<(?:\/)?[A-Za-z](?:[A-Za-z0-9_:.-]*)/g, "sh_keyword", 6, 1 ],
				[ /&(?:[A-Za-z0-9]+);/g, "sh_preproc", -1 ],
				[ /<(?:\/)?[A-Za-z][A-Za-z0-9]*(?:\/)?>/g, "sh_keyword", -1 ],
				[ /<(?:\/)?[A-Za-z][A-Za-z0-9]*/g, "sh_keyword", 6, 1 ],
				[ /@[A-Za-z]+/g, "sh_type", -1 ],
				[ /(?:TODO|FIXME|BUG)(?:[:]?)/g, "sh_todo", -1 ] ],
		[
				[ /\?>/g, "sh_preproc", -2 ],
				[ /([^=" \t>]+)([ \t]*)(=?)/g,
						[ "sh_type", "sh_normal", "sh_symbol" ], -1 ],
				[ /"/g, "sh_string", 3 ] ],
		[ [ /\\(?:\\|")/g, null, -1 ], [ /"/g, "sh_string", -2 ] ],
		[
				[ />/g, "sh_preproc", -2 ],
				[ /([^=" \t>]+)([ \t]*)(=?)/g,
						[ "sh_type", "sh_normal", "sh_symbol" ], -1 ],
				[ /"/g, "sh_string", 3 ] ],
		[ [ /-->/g, "sh_comment", -2 ], [ /<!--/g, "sh_comment", 5 ] ],
		[
				[ /(?:\/)?>/g, "sh_keyword", -2 ],
				[ /([^=" \t>]+)([ \t]*)(=?)/g,
						[ "sh_type", "sh_normal", "sh_symbol" ], -1 ],
				[ /"/g, "sh_string", 3 ] ],
		[ [ /$/g, null, -2 ] ],
		[
				[ /\*\//g, "sh_comment", -2 ],
				[
						/(?:<?)[A-Za-z0-9_\.\/\-_~]+@[A-Za-z0-9_\.\/\-_~]+(?:>?)|(?:<?)[A-Za-z0-9_]+:\/\/[A-Za-z0-9_\.\/\-_~]+(?:>?)/g,
						"sh_url", -1 ],
				[ /<\?xml/g, "sh_preproc", 2, 1 ],
				[ /<!DOCTYPE/g, "sh_preproc", 4, 1 ],
				[ /<!--/g, "sh_comment", 5 ],
				[ /<(?:\/)?[A-Za-z](?:[A-Za-z0-9_:.-]*)(?:\/)?>/g,
						"sh_keyword", -1 ],
				[ /<(?:\/)?[A-Za-z](?:[A-Za-z0-9_:.-]*)/g, "sh_keyword", 6, 1 ],
				[ /&(?:[A-Za-z0-9]+);/g, "sh_preproc", -1 ],
				[ /<(?:\/)?[A-Za-z][A-Za-z0-9]*(?:\/)?>/g, "sh_keyword", -1 ],
				[ /<(?:\/)?[A-Za-z][A-Za-z0-9]*/g, "sh_keyword", 6, 1 ],
				[ /@[A-Za-z]+/g, "sh_type", -1 ],
				[ /(?:TODO|FIXME|BUG)(?:[:]?)/g, "sh_todo", -1 ] ],
		[
				[ /\*\//g, "sh_comment", -2 ],
				[
						/(?:<?)[A-Za-z0-9_\.\/\-_~]+@[A-Za-z0-9_\.\/\-_~]+(?:>?)|(?:<?)[A-Za-z0-9_]+:\/\/[A-Za-z0-9_\.\/\-_~]+(?:>?)/g,
						"sh_url", -1 ],
				[ /(?:TODO|FIXME|BUG)(?:[:]?)/g, "sh_todo", -1 ] ],
		[ [ /"/g, "sh_string", -2 ], [ /\\./g, "sh_specialchar", -1 ] ],
		[ [ /'/g, "sh_string", -2 ], [ /\\./g, "sh_specialchar", -1 ] ] ];

/* perl language (http://shjs.sourceforge.net/lang/sh_perl.min.js) */
if (!this.sh_languages) {
	this.sh_languages = {}
}
sh_languages.perl = [
		[
				[ /\b(?:import)\b/g, "sh_preproc", -1 ],
				[ /(s)(\{(?:\\\}|[^}])*\}\{(?:\\\}|[^}])*\})([ixsmogce]*)/g,
						[ "sh_keyword", "sh_regexp", "sh_keyword" ], -1 ],
				[ /(s)(\((?:\\\)|[^)])*\)\((?:\\\)|[^)])*\))([ixsmogce]*)/g,
						[ "sh_keyword", "sh_regexp", "sh_keyword" ], -1 ],
				[ /(s)(\[(?:\\\]|[^\]])*\]\[(?:\\\]|[^\]])*\])([ixsmogce]*)/g,
						[ "sh_keyword", "sh_regexp", "sh_keyword" ], -1 ],
				[ /(s)(<.*><.*>)([ixsmogce]*)/g,
						[ "sh_keyword", "sh_regexp", "sh_keyword" ], -1 ],
				[ /(q(?:q?))(\{(?:\\\}|[^}])*\})/g,
						[ "sh_keyword", "sh_string" ], -1 ],
				[ /(q(?:q?))(\((?:\\\)|[^)])*\))/g,
						[ "sh_keyword", "sh_string" ], -1 ],
				[ /(q(?:q?))(\[(?:\\\]|[^\]])*\])/g,
						[ "sh_keyword", "sh_string" ], -1 ],
				[ /(q(?:q?))(<.*>)/g, [ "sh_keyword", "sh_string" ], -1 ],
				[ /(q(?:q?))([^A-Za-z0-9 \t])(.*\2)/g,
						[ "sh_keyword", "sh_string", "sh_string" ], -1 ],
				[
						/(s)([^A-Za-z0-9 \t])(.*\2.*\2)([ixsmogce]*(?=[ \t]*(?:\)|;)))/g,
						[ "sh_keyword", "sh_regexp", "sh_regexp", "sh_keyword" ],
						-1 ],
				[
						/(s)([^A-Za-z0-9 \t])(.*\2[ \t]*)([^A-Za-z0-9 \t])(.*\4)([ixsmogce]*(?=[ \t]*(?:\)|;)))/g,
						[ "sh_keyword", "sh_regexp", "sh_regexp", "sh_regexp",
								"sh_regexp", "sh_keyword" ], -1 ],
				[ /#/g, "sh_comment", 1 ],
				[
						/\b[+-]?(?:(?:0x[A-Fa-f0-9]+)|(?:(?:[\d]*\.)?[\d]+(?:[eE][+-]?[\d]+)?))u?(?:(?:int(?:8|16|32|64))|L)?\b/g,
						"sh_number", -1 ],
				[ /(?:m|qr)(?=\{)/g, "sh_keyword", 2 ],
				[ /(?:m|qr)(?=#)/g, "sh_keyword", 4 ],
				[ /(?:m|qr)(?=\|)/g, "sh_keyword", 6 ],
				[ /(?:m|qr)(?=@)/g, "sh_keyword", 8 ],
				[ /(?:m|qr)(?=<)/g, "sh_keyword", 10 ],
				[ /(?:m|qr)(?=\[)/g, "sh_keyword", 12 ],
				[ /(?:m|qr)(?=\\)/g, "sh_keyword", 14 ],
				[ /(?:m|qr)(?=\/)/g, "sh_keyword", 16 ],
				[ /"/g, "sh_string", 18 ],
				[ /'/g, "sh_string", 19 ],
				[ /</g, "sh_string", 20 ],
				[ /\/[^\n]*\//g, "sh_string", -1 ],
				[
						/\b(?:chomp|chop|chr|crypt|hex|i|index|lc|lcfirst|length|oct|ord|pack|q|qq|reverse|rindex|sprintf|substr|tr|uc|ucfirst|m|s|g|qw|abs|atan2|cos|exp|hex|int|log|oct|rand|sin|sqrt|srand|my|local|our|delete|each|exists|keys|values|pack|read|syscall|sysread|syswrite|unpack|vec|undef|unless|return|length|grep|sort|caller|continue|dump|eval|exit|goto|last|next|redo|sub|wantarray|pop|push|shift|splice|unshift|split|switch|join|defined|foreach|last|chop|chomp|bless|dbmclose|dbmopen|ref|tie|tied|untie|while|next|map|eq|die|cmp|lc|uc|and|do|if|else|elsif|for|use|require|package|import|chdir|chmod|chown|chroot|fcntl|glob|ioctl|link|lstat|mkdir|open|opendir|readlink|rename|rmdir|stat|symlink|umask|unlink|utime|binmode|close|closedir|dbmclose|dbmopen|die|eof|fileno|flock|format|getc|print|printf|read|readdir|rewinddir|seek|seekdir|select|syscall|sysread|sysseek|syswrite|tell|telldir|truncate|warn|write|alarm|exec|fork|getpgrp|getppid|getpriority|kill|pipe|qx|setpgrp|setpriority|sleep|system|times|x|wait|waitpid)\b/g,
						"sh_keyword", -1 ],
				[ /^\=(?:head1|head2|item)/g, "sh_comment", 21 ],
				[ /(?:\$[#]?|@|%)[\/A-Za-z0-9_]+/g, "sh_variable", -1 ],
				[ /~|!|%|\^|\*|\(|\)|-|\+|=|\[|\]|\\|:|;|,|\.|\/|\?|&|<|>|\|/g,
						"sh_symbol", -1 ],
				[ /\{|\}/g, "sh_cbracket", -1 ],
				[ /(?:[A-Za-z]|_)[A-Za-z0-9_]*(?=[ \t]*\()/g, "sh_function", -1 ] ],
		[ [ /$/g, null, -2 ] ],
		[ [ /\{/g, "sh_regexp", 3 ] ],
		[
				[ /[ \t]+#.*/g, "sh_comment", -1 ],
				[ /\$(?:[A-Za-z0-9_]+|\{[A-Za-z0-9_]+\})/g, "sh_variable", -1 ],
				[ /\\\{|\\\}|\}/g, "sh_regexp", -3 ] ],
		[ [ /#/g, "sh_regexp", 5 ] ],
		[
				[ /[ \t]+#.*/g, "sh_comment", -1 ],
				[ /\$(?:[A-Za-z0-9_]+|\{[A-Za-z0-9_]+\})/g, "sh_variable", -1 ],
				[ /\\#|#/g, "sh_regexp", -3 ] ],
		[ [ /\|/g, "sh_regexp", 7 ] ],
		[
				[ /[ \t]+#.*/g, "sh_comment", -1 ],
				[ /\$(?:[A-Za-z0-9_]+|\{[A-Za-z0-9_]+\})/g, "sh_variable", -1 ],
				[ /\\\||\|/g, "sh_regexp", -3 ] ],
		[ [ /@/g, "sh_regexp", 9 ] ],
		[
				[ /[ \t]+#.*/g, "sh_comment", -1 ],
				[ /\$(?:[A-Za-z0-9_]+|\{[A-Za-z0-9_]+\})/g, "sh_variable", -1 ],
				[ /\\@|@/g, "sh_regexp", -3 ] ],
		[ [ /</g, "sh_regexp", 11 ] ],
		[
				[ /[ \t]+#.*/g, "sh_comment", -1 ],
				[ /\$(?:[A-Za-z0-9_]+|\{[A-Za-z0-9_]+\})/g, "sh_variable", -1 ],
				[ /\\<|\\>|>/g, "sh_regexp", -3 ] ],
		[ [ /\[/g, "sh_regexp", 13 ] ],
		[
				[ /[ \t]+#.*/g, "sh_comment", -1 ],
				[ /\$(?:[A-Za-z0-9_]+|\{[A-Za-z0-9_]+\})/g, "sh_variable", -1 ],
				[ /\\]|\]/g, "sh_regexp", -3 ] ],
		[ [ /\\/g, "sh_regexp", 15 ] ],
		[
				[ /[ \t]+#.*/g, "sh_comment", -1 ],
				[ /\$(?:[A-Za-z0-9_]+|\{[A-Za-z0-9_]+\})/g, "sh_variable", -1 ],
				[ /\\\\|\\/g, "sh_regexp", -3 ] ],
		[ [ /\//g, "sh_regexp", 17 ] ],
		[
				[ /[ \t]+#.*/g, "sh_comment", -1 ],
				[ /\$(?:[A-Za-z0-9_]+|\{[A-Za-z0-9_]+\})/g, "sh_variable", -1 ],
				[ /\\\/|\//g, "sh_regexp", -3 ] ],
		[ [ /$/g, null, -2 ], [ /\\(?:\\|")/g, null, -1 ],
				[ /"/g, "sh_string", -2 ] ],
		[ [ /$/g, null, -2 ], [ /\\(?:\\|')/g, null, -1 ],
				[ /'/g, "sh_string", -2 ] ],
		[ [ /$/g, null, -2 ], [ />/g, "sh_string", -2 ] ],
		[ [ /\=cut/g, "sh_comment", -2 ] ] ];

/* PHP language (http://shjs.sourceforge.net/lang/sh_php.min.js) */
if (!this.sh_languages) {
	this.sh_languages = {}
}
sh_languages.php = [
		[
				[ /\b(?:include|include_once|require|require_once)\b/g,
						"sh_preproc", -1 ],
				[ /\/\//g, "sh_comment", 1 ],
				[ /#/g, "sh_comment", 1 ],
				[
						/\b[+-]?(?:(?:0x[A-Fa-f0-9]+)|(?:(?:[\d]*\.)?[\d]+(?:[eE][+-]?[\d]+)?))u?(?:(?:int(?:8|16|32|64))|L)?\b/g,
						"sh_number", -1 ],
				[ /"/g, "sh_string", 2 ],
				[ /'/g, "sh_string", 3 ],
				[
						/\b(?:and|or|xor|__FILE__|exception|php_user_filter|__LINE__|array|as|break|case|cfunction|class|const|continue|declare|default|die|do|each|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|eval|exit|extends|for|foreach|function|global|if|isset|list|new|old_function|print|return|static|switch|unset|use|var|while|__FUNCTION__|__CLASS__|__METHOD__)\b/g,
						"sh_keyword", -1 ],
				[ /\/\/\//g, "sh_comment", 4 ],
				[ /\/\//g, "sh_comment", 1 ],
				[ /\/\*\*/g, "sh_comment", 9 ],
				[ /\/\*/g, "sh_comment", 10 ],
				[ /(?:\$[#]?|@|%)[A-Za-z0-9_]+/g, "sh_variable", -1 ],
				[
						/<\?php|~|!|%|\^|\*|\(|\)|-|\+|=|\[|\]|\\|:|;|,|\.|\/|\?|&|<|>|\|/g,
						"sh_symbol", -1 ],
				[ /\{|\}/g, "sh_cbracket", -1 ],
				[ /(?:[A-Za-z]|_)[A-Za-z0-9_]*(?=[ \t]*\()/g, "sh_function", -1 ] ],
		[ [ /$/g, null, -2 ] ],
		[ [ /\\(?:\\|")/g, null, -1 ], [ /"/g, "sh_string", -2 ] ],
		[ [ /\\(?:\\|')/g, null, -1 ], [ /'/g, "sh_string", -2 ] ],
		[
				[ /$/g, null, -2 ],
				[
						/(?:<?)[A-Za-z0-9_\.\/\-_~]+@[A-Za-z0-9_\.\/\-_~]+(?:>?)|(?:<?)[A-Za-z0-9_]+:\/\/[A-Za-z0-9_\.\/\-_~]+(?:>?)/g,
						"sh_url", -1 ],
				[ /<\?xml/g, "sh_preproc", 5, 1 ],
				[ /<!DOCTYPE/g, "sh_preproc", 6, 1 ],
				[ /<!--/g, "sh_comment", 7 ],
				[ /<(?:\/)?[A-Za-z](?:[A-Za-z0-9_:.-]*)(?:\/)?>/g,
						"sh_keyword", -1 ],
				[ /<(?:\/)?[A-Za-z](?:[A-Za-z0-9_:.-]*)/g, "sh_keyword", 8, 1 ],
				[ /&(?:[A-Za-z0-9]+);/g, "sh_preproc", -1 ],
				[ /<(?:\/)?[A-Za-z][A-Za-z0-9]*(?:\/)?>/g, "sh_keyword", -1 ],
				[ /<(?:\/)?[A-Za-z][A-Za-z0-9]*/g, "sh_keyword", 8, 1 ],
				[ /@[A-Za-z]+/g, "sh_type", -1 ],
				[ /(?:TODO|FIXME|BUG)(?:[:]?)/g, "sh_todo", -1 ] ],
		[
				[ /\?>/g, "sh_preproc", -2 ],
				[ /([^=" \t>]+)([ \t]*)(=?)/g,
						[ "sh_type", "sh_normal", "sh_symbol" ], -1 ],
				[ /"/g, "sh_string", 2 ] ],
		[
				[ />/g, "sh_preproc", -2 ],
				[ /([^=" \t>]+)([ \t]*)(=?)/g,
						[ "sh_type", "sh_normal", "sh_symbol" ], -1 ],
				[ /"/g, "sh_string", 2 ] ],
		[ [ /-->/g, "sh_comment", -2 ], [ /<!--/g, "sh_comment", 7 ] ],
		[
				[ /(?:\/)?>/g, "sh_keyword", -2 ],
				[ /([^=" \t>]+)([ \t]*)(=?)/g,
						[ "sh_type", "sh_normal", "sh_symbol" ], -1 ],
				[ /"/g, "sh_string", 2 ] ],
		[
				[ /\*\//g, "sh_comment", -2 ],
				[
						/(?:<?)[A-Za-z0-9_\.\/\-_~]+@[A-Za-z0-9_\.\/\-_~]+(?:>?)|(?:<?)[A-Za-z0-9_]+:\/\/[A-Za-z0-9_\.\/\-_~]+(?:>?)/g,
						"sh_url", -1 ],
				[ /<\?xml/g, "sh_preproc", 5, 1 ],
				[ /<!DOCTYPE/g, "sh_preproc", 6, 1 ],
				[ /<!--/g, "sh_comment", 7 ],
				[ /<(?:\/)?[A-Za-z](?:[A-Za-z0-9_:.-]*)(?:\/)?>/g,
						"sh_keyword", -1 ],
				[ /<(?:\/)?[A-Za-z](?:[A-Za-z0-9_:.-]*)/g, "sh_keyword", 8, 1 ],
				[ /&(?:[A-Za-z0-9]+);/g, "sh_preproc", -1 ],
				[ /<(?:\/)?[A-Za-z][A-Za-z0-9]*(?:\/)?>/g, "sh_keyword", -1 ],
				[ /<(?:\/)?[A-Za-z][A-Za-z0-9]*/g, "sh_keyword", 8, 1 ],
				[ /@[A-Za-z]+/g, "sh_type", -1 ],
				[ /(?:TODO|FIXME|BUG)(?:[:]?)/g, "sh_todo", -1 ] ],
		[
				[ /\*\//g, "sh_comment", -2 ],
				[
						/(?:<?)[A-Za-z0-9_\.\/\-_~]+@[A-Za-z0-9_\.\/\-_~]+(?:>?)|(?:<?)[A-Za-z0-9_]+:\/\/[A-Za-z0-9_\.\/\-_~]+(?:>?)/g,
						"sh_url", -1 ],
				[ /(?:TODO|FIXME|BUG)(?:[:]?)/g, "sh_todo", -1 ] ] ];

/* python language (http://shjs.sourceforge.net/lang/sh_python.min.js) */
if (!this.sh_languages) {
	this.sh_languages = {}
}
sh_languages.python = [
		[
				[ /\b(?:import|from)\b/g, "sh_preproc", -1 ],
				[ /#/g, "sh_comment", 1 ],
				[
						/\b[+-]?(?:(?:0x[A-Fa-f0-9]+)|(?:(?:[\d]*\.)?[\d]+(?:[eE][+-]?[\d]+)?))u?(?:(?:int(?:8|16|32|64))|L)?\b/g,
						"sh_number", -1 ],
				[
						/\b(?:and|assert|break|class|continue|def|del|elif|else|except|exec|finally|for|global|if|in|is|lambda|not|or|pass|print|raise|return|try|while)\b/g,
						"sh_keyword", -1 ],
				[ /^(?:[\s]*'{3})/g, "sh_comment", 2 ],
				[ /^(?:[\s]*\"{3})/g, "sh_comment", 3 ],
				[
						/^(?:[\s]*'(?:[^\\']|\\.)*'[\s]*|[\s]*\"(?:[^\\\"]|\\.)*\"[\s]*)$/g,
						"sh_comment", -1 ],
				[ /(?:[\s]*'{3})/g, "sh_string", 4 ],
				[ /(?:[\s]*\"{3})/g, "sh_string", 5 ],
				[ /"/g, "sh_string", 6 ],
				[ /'/g, "sh_string", 7 ],
				[
						/~|!|%|\^|\*|\(|\)|-|\+|=|\[|\]|\\|:|;|,|\.|\/|\?|&|<|>|\||\{|\}/g,
						"sh_symbol", -1 ],
				[ /(?:[A-Za-z]|_)[A-Za-z0-9_]*(?=[ \t]*\()/g, "sh_function", -1 ] ],
		[ [ /$/g, null, -2 ] ],
		[ [ /(?:'{3})/g, "sh_comment", -2 ] ],
		[ [ /(?:\"{3})/g, "sh_comment", -2 ] ],
		[ [ /(?:'{3})/g, "sh_string", -2 ] ],
		[ [ /(?:\"{3})/g, "sh_string", -2 ] ],
		[ [ /$/g, null, -2 ], [ /\\(?:\\|")/g, null, -1 ],
				[ /"/g, "sh_string", -2 ] ],
		[ [ /$/g, null, -2 ], [ /\\(?:\\|')/g, null, -1 ],
				[ /'/g, "sh_string", -2 ] ] ];

/* ruby language (http://shjs.sourceforge.net/lang/sh_ruby.min.js) */
if (!this.sh_languages) {
	this.sh_languages = {}
}
sh_languages.ruby = [
		[
				[ /\b(?:require)\b/g, "sh_preproc", -1 ],
				[
						/\b[+-]?(?:(?:0x[A-Fa-f0-9]+)|(?:(?:[\d]*\.)?[\d]+(?:[eE][+-]?[\d]+)?))u?(?:(?:int(?:8|16|32|64))|L)?\b/g,
						"sh_number", -1 ],
				[ /"/g, "sh_string", 1 ],
				[ /'/g, "sh_string", 2 ],
				[ /</g, "sh_string", 3 ],
				[ /\/[^\n]*\//g, "sh_regexp", -1 ],
				[ /(%r)(\{(?:\\\}|#\{[A-Za-z0-9]+\}|[^}])*\})/g,
						[ "sh_symbol", "sh_regexp" ], -1 ],
				[
						/\b(?:alias|begin|BEGIN|break|case|defined|do|else|elsif|end|END|ensure|for|if|in|include|loop|next|raise|redo|rescue|retry|return|super|then|undef|unless|until|when|while|yield|false|nil|self|true|__FILE__|__LINE__|and|not|or|def|class|module|catch|fail|load|throw)\b/g,
						"sh_keyword", -1 ],
				[ /(?:^\=begin)/g, "sh_comment", 4 ],
				[ /(?:\$[#]?|@@|@)(?:[A-Za-z0-9_]+|'|\"|\/)/g, "sh_type", -1 ],
				[ /[A-Za-z0-9]+(?:\?|!)/g, "sh_normal", -1 ],
				[ /~|!|%|\^|\*|\(|\)|-|\+|=|\[|\]|\\|:|;|,|\.|\/|\?|&|<|>|\|/g,
						"sh_symbol", -1 ],
				[ /(#)(\{)/g, [ "sh_symbol", "sh_cbracket" ], -1 ],
				[ /#/g, "sh_comment", 5 ], [ /\{|\}/g, "sh_cbracket", -1 ] ],
		[ [ /$/g, null, -2 ], [ /\\(?:\\|")/g, null, -1 ],
				[ /"/g, "sh_string", -2 ] ],
		[ [ /$/g, null, -2 ], [ /\\(?:\\|')/g, null, -1 ],
				[ /'/g, "sh_string", -2 ] ],
		[ [ /$/g, null, -2 ], [ />/g, "sh_string", -2 ] ],
		[ [ /^(?:\=end)/g, "sh_comment", -2 ] ], [ [ /$/g, null, -2 ] ] ];

/* sql language (http://shjs.sourceforge.net/lang/sh_sql.min.js) */
if (!this.sh_languages) {
	this.sh_languages = {}
}
sh_languages.sql = [
		[
				[
						/\b(?:VARCHAR|TINYINT|TEXT|DATE|SMALLINT|MEDIUMINT|INT|BIGINT|FLOAT|DOUBLE|DECIMAL|DATETIME|TIMESTAMP|TIME|YEAR|UNSIGNED|CHAR|TINYBLOB|TINYTEXT|BLOB|MEDIUMBLOB|MEDIUMTEXT|LONGBLOB|LONGTEXT|ENUM|BOOL|BINARY|VARBINARY)\b/gi,
						"sh_type", -1 ],
				[
						/\b(?:ALL|ASC|AS|ALTER|AND|ADD|AUTO_INCREMENT|BETWEEN|BINARY|BOTH|BY|BOOLEAN|CHANGE|CHECK|COLUMNS|COLUMN|CROSS|CREATE|DATABASES|DATABASE|DATA|DELAYED|DESCRIBE|DESC|DISTINCT|DELETE|DROP|DEFAULT|ENCLOSED|ESCAPED|EXISTS|EXPLAIN|FIELDS|FIELD|FLUSH|FOR|FOREIGN|FUNCTION|FROM|GROUP|GRANT|HAVING|IGNORE|INDEX|INFILE|INSERT|INNER|INTO|IDENTIFIED|IN|IS|IF|JOIN|KEYS|KILL|KEY|LEADING|LIKE|LIMIT|LINES|LOAD|LOCAL|LOCK|LOW_PRIORITY|LEFT|LANGUAGE|MODIFY|NATURAL|NOT|NULL|NEXTVAL|OPTIMIZE|OPTION|OPTIONALLY|ORDER|OUTFILE|OR|OUTER|ON|PROCEDURE|PROCEDURAL|PRIMARY|READ|REFERENCES|REGEXP|RENAME|REPLACE|RETURN|REVOKE|RLIKE|RIGHT|SHOW|SONAME|STATUS|STRAIGHT_JOIN|SELECT|SETVAL|SET|TABLES|TERMINATED|TO|TRAILING|TRUNCATE|TABLE|TEMPORARY|TRIGGER|TRUSTED|UNIQUE|UNLOCK|USE|USING|UPDATE|VALUES|VARIABLES|VIEW|WITH|WRITE|WHERE|ZEROFILL|TYPE|XOR)\b/gi,
						"sh_keyword", -1 ],
				[ /"/g, "sh_string", 1 ],
				[ /'/g, "sh_string", 2 ],
				[ /`/g, "sh_string", 3 ],
				[ /#/g, "sh_comment", 4 ],
				[ /\/\/\//g, "sh_comment", 5 ],
				[ /\/\//g, "sh_comment", 4 ],
				[ /\/\*\*/g, "sh_comment", 11 ],
				[ /\/\*/g, "sh_comment", 12 ],
				[ /--/g, "sh_comment", 4 ],
				[ /~|!|%|\^|\*|\(|\)|-|\+|=|\[|\]|\\|:|;|,|\.|\/|\?|&|<|>|\|/g,
						"sh_symbol", -1 ],
				[
						/\b[+-]?(?:(?:0x[A-Fa-f0-9]+)|(?:(?:[\d]*\.)?[\d]+(?:[eE][+-]?[\d]+)?))u?(?:(?:int(?:8|16|32|64))|L)?\b/g,
						"sh_number", -1 ] ],
		[ [ /"/g, "sh_string", -2 ], [ /\\./g, "sh_specialchar", -1 ] ],
		[ [ /'/g, "sh_string", -2 ], [ /\\./g, "sh_specialchar", -1 ] ],
		[ [ /`/g, "sh_string", -2 ], [ /\\./g, "sh_specialchar", -1 ] ],
		[ [ /$/g, null, -2 ] ],
		[
				[ /$/g, null, -2 ],
				[
						/(?:<?)[A-Za-z0-9_\.\/\-_~]+@[A-Za-z0-9_\.\/\-_~]+(?:>?)|(?:<?)[A-Za-z0-9_]+:\/\/[A-Za-z0-9_\.\/\-_~]+(?:>?)/g,
						"sh_url", -1 ],
				[ /<\?xml/g, "sh_preproc", 6, 1 ],
				[ /<!DOCTYPE/g, "sh_preproc", 8, 1 ],
				[ /<!--/g, "sh_comment", 9 ],
				[ /<(?:\/)?[A-Za-z](?:[A-Za-z0-9_:.-]*)(?:\/)?>/g,
						"sh_keyword", -1 ],
				[ /<(?:\/)?[A-Za-z](?:[A-Za-z0-9_:.-]*)/g, "sh_keyword", 10, 1 ],
				[ /&(?:[A-Za-z0-9]+);/g, "sh_preproc", -1 ],
				[ /<(?:\/)?[A-Za-z][A-Za-z0-9]*(?:\/)?>/g, "sh_keyword", -1 ],
				[ /<(?:\/)?[A-Za-z][A-Za-z0-9]*/g, "sh_keyword", 10, 1 ],
				[ /@[A-Za-z]+/g, "sh_type", -1 ],
				[ /(?:TODO|FIXME|BUG)(?:[:]?)/g, "sh_todo", -1 ] ],
		[
				[ /\?>/g, "sh_preproc", -2 ],
				[ /([^=" \t>]+)([ \t]*)(=?)/g,
						[ "sh_type", "sh_normal", "sh_symbol" ], -1 ],
				[ /"/g, "sh_string", 7 ] ],
		[ [ /\\(?:\\|")/g, null, -1 ], [ /"/g, "sh_string", -2 ] ],
		[
				[ />/g, "sh_preproc", -2 ],
				[ /([^=" \t>]+)([ \t]*)(=?)/g,
						[ "sh_type", "sh_normal", "sh_symbol" ], -1 ],
				[ /"/g, "sh_string", 7 ] ],
		[ [ /-->/g, "sh_comment", -2 ], [ /<!--/g, "sh_comment", 9 ] ],
		[
				[ /(?:\/)?>/g, "sh_keyword", -2 ],
				[ /([^=" \t>]+)([ \t]*)(=?)/g,
						[ "sh_type", "sh_normal", "sh_symbol" ], -1 ],
				[ /"/g, "sh_string", 7 ] ],
		[
				[ /\*\//g, "sh_comment", -2 ],
				[
						/(?:<?)[A-Za-z0-9_\.\/\-_~]+@[A-Za-z0-9_\.\/\-_~]+(?:>?)|(?:<?)[A-Za-z0-9_]+:\/\/[A-Za-z0-9_\.\/\-_~]+(?:>?)/g,
						"sh_url", -1 ],
				[ /<\?xml/g, "sh_preproc", 6, 1 ],
				[ /<!DOCTYPE/g, "sh_preproc", 8, 1 ],
				[ /<!--/g, "sh_comment", 9 ],
				[ /<(?:\/)?[A-Za-z](?:[A-Za-z0-9_:.-]*)(?:\/)?>/g,
						"sh_keyword", -1 ],
				[ /<(?:\/)?[A-Za-z](?:[A-Za-z0-9_:.-]*)/g, "sh_keyword", 10, 1 ],
				[ /&(?:[A-Za-z0-9]+);/g, "sh_preproc", -1 ],
				[ /<(?:\/)?[A-Za-z][A-Za-z0-9]*(?:\/)?>/g, "sh_keyword", -1 ],
				[ /<(?:\/)?[A-Za-z][A-Za-z0-9]*/g, "sh_keyword", 10, 1 ],
				[ /@[A-Za-z]+/g, "sh_type", -1 ],
				[ /(?:TODO|FIXME|BUG)(?:[:]?)/g, "sh_todo", -1 ] ],
		[
				[ /\*\//g, "sh_comment", -2 ],
				[
						/(?:<?)[A-Za-z0-9_\.\/\-_~]+@[A-Za-z0-9_\.\/\-_~]+(?:>?)|(?:<?)[A-Za-z0-9_]+:\/\/[A-Za-z0-9_\.\/\-_~]+(?:>?)/g,
						"sh_url", -1 ],
				[ /(?:TODO|FIXME|BUG)(?:[:]?)/g, "sh_todo", -1 ] ] ];

/* URL language (http://shjs.sourceforge.net/lang/sh_url.min.js) */
if (!this.sh_languages) {
	this.sh_languages = {};
}
sh_languages['url'] = [ [ {
	'regex' : /(?:<?)[A-Za-z0-9_\.\/\-_]+@[A-Za-z0-9_\.\/\-_]+(?:>?)/g,
	'style' : 'sh_url'
}, {
	'regex' : /(?:<?)[A-Za-z0-9_]+:\/\/[A-Za-z0-9_\.\/\-_]+(?:>?)/g,
	'style' : 'sh_url'
} ] ];

/* XML language (http://shjs.sourceforge.net/lang/sh_xml.min.js) */
if (!this.sh_languages) {
	this.sh_languages = {}
}
sh_languages.xml = [
		[
				[ /<\?xml/g, "sh_preproc", 1, 1 ],
				[ /<!DOCTYPE/g, "sh_preproc", 3, 1 ],
				[ /<!--/g, "sh_comment", 4 ],
				[ /<(?:\/)?[A-Za-z](?:[A-Za-z0-9_:.-]*)(?:\/)?>/g,
						"sh_keyword", -1 ],
				[ /<(?:\/)?[A-Za-z](?:[A-Za-z0-9_:.-]*)/g, "sh_keyword", 5, 1 ],
				[ /&(?:[A-Za-z0-9]+);/g, "sh_preproc", -1 ] ],
		[
				[ /\?>/g, "sh_preproc", -2 ],
				[ /([^=" \t>]+)([ \t]*)(=?)/g,
						[ "sh_type", "sh_normal", "sh_symbol" ], -1 ],
				[ /"/g, "sh_string", 2 ] ],
		[ [ /\\(?:\\|")/g, null, -1 ], [ /"/g, "sh_string", -2 ] ],
		[
				[ />/g, "sh_preproc", -2 ],
				[ /([^=" \t>]+)([ \t]*)(=?)/g,
						[ "sh_type", "sh_normal", "sh_symbol" ], -1 ],
				[ /"/g, "sh_string", 2 ] ],
		[ [ /-->/g, "sh_comment", -2 ], [ /<!--/g, "sh_comment", 4 ] ],
		[
				[ /(?:\/)?>/g, "sh_keyword", -2 ],
				[ /([^=" \t>]+)([ \t]*)(=?)/g,
						[ "sh_type", "sh_normal", "sh_symbol" ], -1 ],
				[ /"/g, "sh_string", 2 ] ] ];
